我正在处理导入功能,我必须从文件导入数据并使用hibernate将其更新到数据库。
对象结构是:有一个父级,它有一组子级。
当我执行导入时,我首先删除所有现有的子项,然后添加我从文件中读取的新子项。
我这样做的方式如下
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.删除所有孩子
因此,作为上述顺序的结果,它会删除父项中的所有子项,甚至是因为导入而新添加的子项。
似乎hibernate并没有维持我调用DML的顺序。有人能就此提出一些建议吗?如果问题不明确,请告诉我。
答案 0 :(得分:0)
Collections.clear()并不等同于删除。您需要调用显式删除以确保在插入之前删除。否则,当会话终止时,隐式删除将被执行。