0

我正在研究导入功能,我必须从文件中导入数据并使用休眠将其更新到数据库。

对象结构是:有一个父级,它有一组子级。

当我进行导入时,我首先删除所有现有的孩子,然后添加我从文件中读取的新孩子。

我这样做的方式如下

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 的顺序。谁能给我一些建议?如果问题不清楚,请告诉我。

4

1 回答 1

0

Collections.clear() 不等于删除。您需要调用显式删除以确保在插入之前删除。否则,当您的会话终止时,隐式删除将被执行。

于 2012-11-19T10:17:46.083 回答