使用Hibernate执行单独的隔离操作,在操作之间共享对象

时间:2013-07-14 01:06:54

标签: java database hibernate transactions robustness

我正在使用Hibernate编写Java应用程序,我正在尝试执行以下操作:

  1. 查询数据库中的对象列表,然后查询每个对象:
  2. 将其从数据库中删除。
  3. 对其执行操作。
  4. 如果操作失败,请修改对象并将其重新插入数据库。
  5. 但是,我正在使用不可靠的数据库连接,并且必须在对其执行操作之前成功从数据库中删除该对象(步骤2)(步骤3)。重要但不重要的是,对象在失败时成功重新插入(步骤4)。

    (更高级别的要求是,如果对对象成功执行操作,它不能保留在数据库中 - 这就是为什么我断定我必须首先将其删除并确保在尝试操作之前实际删除它。)

    我不完全了解Hibernate会话,事务和对象状态(例如“分离”)。我怎么能做到这一点?

    我尝试过多次打开/关闭会话,提交/回滚事务,驱逐/合并/持久/保存/删除/更新对象列表,但我尝试的所有内容都会因一个错误或其他错误而失败。我一直在提到Hibernate的文档,但基本上我在黑暗中徘徊,因为我不太明白我在做什么,所以欢迎任何建议。

1 个答案:

答案 0 :(得分:2)

基本上,事务确保在事务的开始和结束之间执行的所有操作都是成功执行或取消的。因此,数据库的状态要么保持在事务开始之前(如果是回滚),要么包含所有在事务期间完成的修改(插入,更新,删除)(在成功提交的情况)。

因此,只需打开一个事务,执行所需的所有操作,然后提交事务。如果有任何异常,请回滚事务。数据库的状态将保持不变,或者包含您在事务期间所做的所有删除和重新插入。

鉴于您并不真正关心重新插入,您还可以使用第一个事务来删除所有内容,如果此事务已成功提交,则执行操作和重新插入的一个或多个后续事务。

the documentation中描述了在非托管环境(我假设您所处的环境)中启动,提交和回滚事务的典型方法。