使用jpa持久化(或查找)对象不会保存它封装的对象列表

时间:2014-07-09 22:53:40

标签: java jpa

假设我们在关系数据库中有一个表" Book"由表" Page"引用。一本书包含一个或多个页面,一个页面属于一本书。

在JPA中,这种关系在实体类

中定义如下
class Book:
@OneToMany(mappedBy = "book")
private List<Page> pageList;

class Page:
@JoinColumn(name = "book", referencedColumnName = "id")
@ManyToOne
private Book book;

现在,如果我创建一个Book实例,并使用一个Page实体objets列表设置其页面列表。 当我坚持这本书(见下面的代码)时,我发现这本书存储在书本书中,但书页却没有保存。这可以自动完成,即如果我保存一本书,而书中包含的页面也保存在Page表中。

同样的问题,对于一本书的检索,逻辑上当我拿到一本书(使用jpa find方法)并且它封装了一个页面列表,我必须在书籍实例中有相关的页面,但事实并非如此。 / p>

那我的错是什么?或者我错过了什么?

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

1 个答案:

答案 0 :(得分:3)

您需要添加@OneToMany(mappedBy = "book", cascade = CascadeType.PERSIST)。 对于JPA的OneToMany,默认情况下,没有任何操作Cascaded