2014-01-13 39 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; 

注意**,我只是给解决方案外,你必须改变你的书申报过。但我想让你理解概念并修复你自己,而不是在这里指出答案。