如何从事务中提取更新以便稍后完成?

时间:2013-04-10 16:49:44

标签: java spring hibernate

我有一个事务获取一些数据,插入一些数据并在一个表上进行更新。这个更新的表导致一些Oracle锁定,所以我想从这个事务中取出更新并在我的进程结束时启动一个新的事务来进行更新。

所以目前我在连接中得到更新的表,然后我,更新对象中的一些数据,然后在事务结束时,hibernate做了它的魔术并更新了表。我想改变这一点,我想,在事务开始时获取数据,分离对象,更新对象中的数据,然后在新事务中执行merge()。可能?由于HibernateTemplate没有detach()方法,我无法弄清楚如何分离它。

不确定这是否重要,但我有一对一的关联:

 <one-to-one name="itmInstSum" class="dds.tmatic.domain.ItmInstSum" fetch="join"  />

有什么想法吗?我不理解分离?我相信evict()将它从缓存或其他东西中删除,这不是我想要做的......

1 个答案:

答案 0 :(得分:1)

首先:在commit()方法中,Hibernate重新排列数据库语句的顺序,这有时会产生不需要的结果。使用Session.flush(),您可以影响此行为。 Hibernate只在两个flush()语句之间重新排列语句(commit()隐式调用flush())。

第二:Hibernate没有分离,但它有Session.evict()方法,它使对象不受Hibernate的控制。如果你想再次将它置于Hibernate的控制之下并将其合并,那么你必须再次从数据库加载对象并合并它来手动复制修改后的属性。