假设我们在关系数据库中有一个表“Book”,由表“Page”引用。一本书包含一页或多页,一页属于一本书。
在 JPA 中,此关系在实体类中定义如下
class Book:
@OneToMany(mappedBy = "book")
private List<Page> pageList;
class Page:
@JoinColumn(name = "book", referencedColumnName = "id")
@ManyToOne
private Book book;
现在,如果我创建一个 Book 实例,并使用页面实体对象列表设置其页面列表。 当我保留这本书时(参见下面的代码),我发现这本书存储在表 Book 中,但没有保存书页。这可以自动完成吗,即如果我保存一本书,同时书中包含的页面也保存在页表中。
同样的问题对于书籍的检索,从逻辑上讲,当我得到一本书(使用 jpa find 方法)并且它封装了页面列表时,我必须在书籍实例中具有关联的页面,但事实并非如此。
那我的错是什么?或者我缺少什么?
public void add(Book book) throws TestException
{
try {
em = getEmf().createEntityManager();
EntityTransaction tr = em.getTransaction();
tr.begin();
em.persist(book);
tr.commit();
em.close();
} catch (PersistenceException pex) {
throw new TestException(
"This book already exists.", pex);
}
}
最佳答案
您需要添加@OneToMany(mappedBy = "book",cascade = CascadeType.PERSIST)
。
对于 JPA 的 OneToMany
,默认情况下没有任何操作 Cascaded .
关于java - 使用 jpa 持久化(或查找)对象不会保存其封装的对象列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24664920/