Java @EntityManager引发OnetoMany映射异常
我目前正试图以双向关系映射这两个实体,但得到一个异常,如图所示。实体 Book.java:Java @EntityManager引发OnetoMany映射异常,java,jpa,entitymanager,Java,Jpa,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="boo
@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;
}
...
}
例外情况:
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)
有什么想法吗?有关如何使用JoinColumn
的信息,请参阅
详细说明:您的作者
实体必须指向书籍
实体,而不是其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;
// ...
}
@实体
@表(name=“Book”)
公共课堂用书{
@OneToMany(fetch=FetchType.LAZY,cascade=CascadeType.ALL,mappedBy=“book”)
私人收藏作者;
// ...
}
@实体
公共类作者{
@manytone(fetch=FetchType.LAZY)
@JoinColumn(name=“book\u id”)
私人书籍;
// ...
}
为什么每个作者都有一本书(这里的join列指向这本书)是有疑问的,但是您可能应该重新考虑您的数据模型:多对多关系可能更有意义,但您需要第三个表(有一些示例说明如何相应地设置JPA实体).对于简单的关系,我建议浏览以下链接 尝试理解ORM提供的错误消息
org.hibstore.domain.Author.bookId references an unknown entity: java.lang.Long
ORM表示Long(即Author.bookId)不是一个实体。是,因为您试图关联字段,而不是注释为实体的对象。您必须提供“Book”类型而不是bookid
改为
private Book book;
注**,我刚刚给出了例外情况的解决方案,您也必须更改书中的声明。但我希望你理解概念,自己解决问题,而不是在这里指出答案。还有许多其他问题,但这确实有所帮助。我知道数据模型是不确定的,但现在只是让这些简单的实体工作。下一步将探索多对多。谢谢:)
private Book book;