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

标签 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 实例,并使用页面实体对象列表设置其页面列表。 当我保留这本书时(参见下面的代码),我发现这本书存储在表 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/

相关文章:

java - 分离对象中的 Hibernate 延迟加载

java - 使用 Hibernate-JPA 更新父子关系时出错

hibernate - JPA 和 Hibernate 代理行为

java - Spring - 在 JPA 事务之后提交 JMS 事务

java - 在 Canvas 周围绘制边框

java - 我可以在没有相对路径的情况下在project.ecore中引用java.ecore吗?但使用模块引用代替?

java - 当在字段上设置默认值时,JPA/Hibernate 插入 NULL

java - CriteriaBuilder 查询中的重音不敏感

Java套接字: how to skip reading line from server when no output is sent from the server

java - Tomcat 内存缓存 - 集群上的复制