Hibernate没有维持持久性顺序

时间:2012-11-19 09:59:13

标签: java hibernate persistence

我正在处理导入功能,我必须从文件导入数据并使用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的顺序。有人能就此提出一些建议吗?如果问题不明确,请告诉我。

1 个答案:

答案 0 :(得分:0)

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