2014-01-13 36 views
0

我目前正試圖在雙向關係中映射這兩個實體,但得到如圖所示的異常。實體@OnetoMany爲EntityManager引發的映射異常

Book.java:

@Entity 
@Table(name = "Book") 
public class Book { 

    @Id 
    @GeneratedValue 
    @Column(name = "id") 
    private Long id; 


    @OneToMany(fetch=FetchType.LAZY, cascade = CascadeType.ALL, mappedBy="bookId") 
    private Collection<Author> authors; 

    public Collection<Author> getAuthors() { 
     return authors; 
    } 

     ... 
} 

Author.java:

@Entity 
public class Author { 

    @Id 
    @GeneratedValue 
    @Column(name="id") 
    private Long id; 

    @ManyToOne(fetch=FetchType.LAZY) 
    @JoinColumn(name="author_id") 
    private Long bookId; 

     ... 
} 

例外:

Exception in thread "main" javax.persistence.PersistenceException: [PersistenceUnit: BookStore] Unable to build EntityManagerFactory 
    at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:914) 
    at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:889) 
    at org.hibernate.ejb.HibernatePersistence.createEntityManagerFactory(HibernatePersistence.java:56) 
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:63) 
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:47) 
    at org.hibstore.dao.DAOTest.main(DAOTest.java:10) 
Caused by: org.hibernate.AnnotationException: @OneToOne or @ManyToOne on org.hibstore.domain.Author.bookId references an unknown entity: java.lang.Long 
    at org.hibernate.cfg.ToOneFkSecondPass.doSecondPass(ToOneFkSecondPass.java:109) 
    at org.hibernate.cfg.Configuration.processEndOfQueue(Configuration.java:1514) 

任何想法?

回答

2

有關如何使用JoinColumn,請參閱this post

詳細說明:您的Author實體必須指向Book實體,而不是其ID。這是使用JPA的優勢:你使用實體而不是密鑰。

下面是一個例子:

@Entity 
@Table(name = "Book") 
public class Book { 
    @OneToMany(fetch=FetchType.LAZY, cascade = CascadeType.ALL, mappedBy="book") 
    private Collection<Author> authors; 
    // ... 
} 

@Entity 
public class Author { 
    @ManyToOne(fetch=FetchType.LAZY) 
    @JoinColumn(name="book_id") 
    private Book book; 
    // ... 
} 

爲什麼你會每位作者的一本書(連接列點到這裏的書),然而有問題,你應該重新考慮你的數據模型:一個多對多的關係可能會更有意義,但是您將需要第三張表格(有相應的示例來說明如何設置您的JPA實體)。

+0

有多個其他問題,但這確實有幫助。我知道數據模型是不確定的,但只是讓這些簡單的實體工作。接下來將探索多對多。謝謝 :) – user1882491

0

對於簡單關係,我建議通過以下鏈接http://www.objectdb.com/api/java/jpa/annotations/relationship

嘗試瞭解錯誤消息的ORM提供..

org.hibstore.domain.Author.bookId references an unknown entity: java.lang.Long 

ORM說龍(這是Author.bookId)不是一個實體。是的,因爲你試圖關聯字段而不是註釋爲實體的對象。您必須提供「Book」類型而不是bookid。

更改爲

private Book book; 

注意**,我只是給解決方案外,你必須改變你的書申報過。但我想讓你理解概念並修復你自己,而不是在這裏指出答案。