【发布时间】: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