Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java @EntityManager引发OnetoMany映射异常_Java_Jpa_Entitymanager - Fatal编程技术网

Java @EntityManager引发OnetoMany映射异常

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

我目前正试图以双向关系映射这两个实体,但得到一个异常,如图所示。实体

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;
    }

        ...
}
例外情况:

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;