首页 > 解决方案 > JPA单向映射以插入子实体列表以及父实体+分别插入子实体

问题描述

我的父子单向关系如下:

@Entity
@Table(name = "PARENT")
public class Parent {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "ID")
    private int parentId;

    @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.PERSIST)
    @JoinColumn(name = "parent_id", nullable = false)
    private List<Child> children;
}

@Entity
@Table(name = "CHILD")
public class Child {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "ID")
    private int id;

    @Column(name = "PARENT_ID", insertable = false, updatable= false)
    private int parentId;

    //some other field
}

我创建了一个父实例,为其分配了一个子列表并尝试将其持久化,它运行良好。

Parent p = new Parent();
List<Child> children = new ArrayList<Child>();
Child c = new Child();
children.add(c);
p.addChildren(children);
em.persit(p);
em.flush();

当我尝试通过子实体单独保存时,我看到插入查询正在尝试将 null 插入子表中的列 PARENT_ID 并导致

Child c = new Child();
c.setId(78987);
c.setParentId(12345);
em.persist(c);
em.flush();

保存独立于父表的子实体时出现异常。我试图插入的子实体与已经存在的父实体相关。

java.sql.SQLIntegrityConstraintViolationException: ORA-01400: cannot insert NULL into (&quot;MY_SCHEMA&quot;.&quot;PARENT&quot;.&quot;PARENT_ID&quot;)_

将关系定义为单向后是否不能直接保存子实体?

标签: springhibernatejpa

解决方案


@Shekhar Khairnar当您进行同样提到的更改时,它将起作用。

当您将孩子添加到父母时效果很好,但在定义孩子时不起作用。

当创建/更新引用列的责任不在当前实体中,而是在另一个实体中时,您会这样做。

如果要使用单向添加子对象,则应删除insertable = false定义。

但是,这样的使用可能会导致数据不一致。你应该注意。

另外,定义child的时候不需要给id,因为这会根据你的model自动创建,不会取你给的值。


推荐阅读