我正在处理导入功能,其中我必须从文件导入数据并使用休眠将其更新到数据库。休眠不保持坚持顺序
对象结构是:有一个父对象,它有一组子对象。
当我进行导入时,我首先删除所有现有的孩子,然后添加我从文件中读取的新孩子。
我做到这一点的方法是如下
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的顺序。任何人都可以提供一些建议吗?如果问题不明确,请告知我。
您可以尝试在[session.flush()](http://docs.jboss.org/hibernate/orm/3.5/api/org/hibernate/Session.html#flush%28%29)之后执行第一个saveOrUpdate()? – Pablo
我介绍了其他来源,发现不建议使用session.flush。 – shashikanthb
同花顺是不好的风格。你的映射怎么看? –