spring - 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 ("MY_SCHEMA"."PARENT"."PARENT_ID")_
将关系定义为单向后是否不能直接保存子实体?
解决方案
@Shekhar Khairnar
当您进行同样提到的更改时,它将起作用。
当您将孩子添加到父母时效果很好,但在定义孩子时不起作用。
如果要使用单向并添加子对象,则应删除insertable = false
定义。
但是,这样的使用可能会导致数据不一致。你应该注意。
另外,定义child的时候不需要给id,因为这会根据你的model自动创建,不会取你给的值。
推荐阅读
- python - 当问题是回归问题时,如何计算准确性?
- sql - 按时间跨度的行数进行 SQL 查询
- php - 合并具有相同键值的子数组
- powerbi - 如何使用 Power BI 中的当前数据集计算 3 个月的滚动平均值?
- flutter - 如何在按钮颤振中给出条件
- google-sheets - 是否可以根据另一列中的对列表进行字符串替换?(用多个前后值对替换一个范围)
- python - 如何使用 Tensorflow 修复此错误?
- python - Dict 中的序列元素无法正确加载
- bash - 如何在使用'ls'命令以及将输出分配给变量时抑制stderr?
- flutter - Flutter googele LineChart with String domainFn