我正在研究导入功能,我必须从文件中导入数据并使用休眠将其更新到数据库。
对象结构是:有一个父级,它有一组子级。
当我进行导入时,我首先删除所有现有的孩子,然后添加我从文件中读取的新孩子。
我这样做的方式如下
parent = session.load(<id of parent>)
parent.getchildrenSet.clear()
parent.saveOrUpdate(parent);
然后,在一个循环中创建新的子节点并将其添加到父节点的 childrenSet 中。然后
parent.saveOrUpdate(parent);
映射如下
在父级
@OneToMany(cascade = CascadeType.ALL)
@JoinTable(name = "CHILD_TABLE", joinColumns = { @JoinColumn(name = "CHILD_PARENT_ID") }, inverseJoinColumns = { @JoinColumn(name = "CHILD_ID") })
@MapKeyColumn(name = "CHILD_ID")
private Map<Long, Children> childrenMap;
在孩子
@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "CHILD_PARENT_ID")
private Parent parent;
当我运行此代码时,我希望日志按以下顺序打印 DML
1. 删除所有子级
2. 插入新子级
3. 更新父级
但它打印的是
1. 插入新子
2. 更新父
3. 删除所有子
因此,由于上述顺序,它会从父级中删除所有子级,甚至是我因导入而新添加的子级。
似乎休眠不保持我调用 DML 的顺序。谁能给我一些建议?如果问题不清楚,请告诉我。