【问题标题】:JPA OneToMany collection returned as EmptyJPA OneToMany 集合返回为 Empty
【发布时间】:2014-02-03 08:08:18
【问题描述】:

查找以前保存的一对多实体。权利是:

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 + "]";
    }
}

作者.java:

@Entity
@Table(name = "Authors")
public class Author {

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

    @ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn(name="book_id")
    private Book book;

        ...

    @Override
    public String toString() {
         return "Author [id=" + id + ", book=" + book + ", firstName="
            + firstName + ", lastName=" + lastName + "]";
    }
}

忽略数据模型的可疑基数,查找代码是

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]

任何想法为什么作者是空的?


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)

【问题讨论】:

  • 您可能需要在尝试打印之前显式调用图书上的getAuthors()
  • 试过了,没用:(
  • 查看 JPA 生成的查询并确保子查询正在触发并且您在 DB 中有子记录。希望您已经尝试过该选项,但这里的其他一切看起来都很好。
  • 正在填充数据库,但是,有一件事 - 数据库中的连接字段内容是 null...有趣的是,如果我在我之后立即进行查找,则会填充 List保存实体。但是一旦我用上面的代码启动一个新客户端,它就是空的
  • 那么问题可能出在插入记录时。您需要将父级设置为子级并将子级添加到父级,例如book.addAuthor(author); and author.setBook(book),因为孩子正在推动这里的关系。

标签: java jpa entitymanager


【解决方案1】:

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

【讨论】:

  • 我不明白这是怎么回事。你能告诉我在这种情况下发生了什么吗?
【解决方案2】:

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

【讨论】:

  • 试过了,没用,不过还是谢谢你的回答:)
猜你喜欢
  • 1970-01-01
  • 2012-04-11
  • 1970-01-01
  • 2020-02-25
  • 1970-01-01
  • 1970-01-01
  • 2016-08-17
  • 1970-01-01
  • 2011-11-26
相关资源
最近更新 更多