2012-11-19 126 views
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。删除所有的孩子

因此,作为上述命令的结果,它将从父母中删除所有孩子,甚至是因为导入而新增的孩子。

看起来好像hibernate不会维护我调用DML的顺序。任何人都可以提供一些建议吗?如果问题不明确,请告知我。

+0

您可以尝试在[session.flush()](http://docs.jboss.org/hibernate/orm/3.5/api/org/hibernate/Session.html#flush%28%29)之后执行第一个saveOrUpdate()? – Pablo

+0

我介绍了其他来源,发现不建议使用session.flush。 – shashikanthb

+0

同花顺是不好的风格。你的映射怎么看? –

回答

0

Collections.clear()不等于删除。你需要调用一个明确的删除来确保你在删除之前删除。否则,当会话终止时,隐式删除将得到缓冲。

+0

谢谢@Farhan,我会尝试。你可以建议我一本好书,这将有助于我理解Hibernate – shashikanthb

+0

我从“NHibernate in Action”一书中学到了很多,我猜http://www.manning.com/bauer/也很好 –