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 JPA OneToMany集合返回为空_Java_Jpa_Entitymanager - Fatal编程技术网

Java JPA OneToMany集合返回为空

Java JPA 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="book", orphanRemoval

查找以前保存的一对多实体。应享权利包括:

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="book", orphanRemoval=true)
    private Collection<Author> authors;

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

        @Override
    public String toString() {
        return "Book [id=" + id + ", authors=" + authors + ", title=" + title
                + ", isbn=" + isbn + "]";
    }
}
忽略数据模型的可疑基数,查找代码是

long bookID = 10; // saved entity ID
entityManager.getTransaction().begin();
Book savedBook = entityManager.find(Book.class, bookID);
System.out.println("Book " + savedBook);
entityManager.getTransaction().commit();
它给出了输出

Book Book [id=10, authors=[], title=Treasure Island, isbn=123456]
你知道为什么作者是空的吗



问题可能是在插入记录时。
您需要将父对象设置为子对象,并将子对象添加到父对象,如
book.addAuthor(author)
author.setBook(book)
因为孩子在这里驱动关系。

问题可能是在插入记录时。
您需要将父对象设置为子对象,并将子对象添加到父对象,如
book.addAuthor(author)
author.setBook(book)
因为孩子在这里驱动关系。

这个问题的另一个解决方案可能是将@ManyToOne的Entity author>book字段映射设置为
@ManyToOne(fetch=FetchType.LAZY,cascade=CascadeType.PERSIST)

这个问题的另一个解决方案可能是设置@ManyToOne到
@ManyToOne的实体Author>book字段映射(fetch=FetchType.LAZY,cascade=CascadeType.PERSIST)

在尝试打印之前,您可能需要在book上显式调用
getAuthors()
。尝试过了,没有成功:(请参阅JPA生成的查询,并确保子查询正在启动,并且您在DB中有子记录。希望您已经尝试了该选项,但这里的其他一切看起来都很好。DB正在填充,但是,有一件事-数据库中的联接字段内容是
null
。有趣的是,
列表
非常流行。)如果我在保存实体后立即执行查找,则会被忽略。但是,一旦我使用上述代码启动新客户端,则为空。问题可能在于插入记录时。您需要将父对象设置为子对象,并将子对象添加到父对象,如
book.addAuthor(author);和author.setBook(book)
因为孩子在这里驱动关系。在您尝试打印之前,您可能需要显式调用book上的
getAuthors()
。尝试过,但无效:(请参阅JPA生成的查询,并确保子查询正在启动,并且您在DB中有子记录。希望您已经尝试了该选项,但这里的其他一切看起来都很好。DB正在填充,但是,有一件事-数据库中的联接字段内容是
null
。有趣的是,
列表
非常流行。)如果我在保存实体后立即执行查找,则会被忽略。但是,一旦我使用上述代码启动新客户端,则为空。问题可能在于插入记录时。您需要将父对象设置为子对象,并将子对象添加到父对象,如
book.addAuthor(author);和author.setBook(book)
当孩子在这里推动关系时。尝试了这个,没用,谢谢你的回答:)尝试了这个,没用,谢谢你的回答:)我不明白这是怎么回事。你能告诉我在这种情况下发生了什么吗?我不明白这是怎么回事。你能告诉我在这种情况下发生了什么吗?
Book Book [id=10, authors=[], title=Treasure Island, isbn=123456]
Retrieving 11...

Exception in thread "main" java.lang.StackOverflowError
    at java.lang.Long.toString(Long.java:240)
    at java.lang.Long.toString(Long.java:100)
    at java.lang.String.valueOf(String.java:2946)
    at java.lang.Long.toString(Long.java:733)
    at java.lang.String.valueOf(String.java:2827)
    at java.lang.StringBuilder.append(StringBuilder.java:115)
    at org.hibstore.domain.Book.toString(Book.java:64)
    at java.lang.String.valueOf(String.java:2827)
    at java.lang.StringBuilder.append(StringBuilder.java:115)
    at org.hibstore.domain.Author.toString(Author.java:67)
    at java.lang.String.valueOf(String.java:2827)
    at java.lang.StringBuilder.append(StringBuilder.java:115)
    at java.util.AbstractCollection.toString(AbstractCollection.java:422)
    at org.hibernate.collection.internal.PersistentBag.toString(PersistentBag.java:501)
    at java.lang.String.valueOf(String.java:2827)
    at java.lang.StringBuilder.append(StringBuilder.java:115)
    at org.hibstore.domain.Book.toString(Book.java:64)
    at java.lang.String.valueOf(String.java:2827)