【问题标题】:Executing separate, isolated operations with Hibernate, sharing objects between operations使用 Hibernate 执行单独、隔离的操作,在操作之间共享对象
【发布时间】:2013-07-12 05:15:26
【问题描述】:

我正在用 Java 编写一个带有 Hibernate 的应用程序,我正在尝试执行以下操作:

  1. 从数据库中查询对象列表,然后针对每个对象:
  2. 将其从数据库中删除。
  3. 对其执行操作。
  4. 如果操作失败,请修改对象并将其重新插入数据库。

但是,我正在使用不可靠的数据库连接,必须先从数据库中成功删除对象(步骤 2),然后再对其执行操作(步骤 3)。在失败时成功重新插入对象(第 4 步)很重要但并不重要。

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

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

我已经尝试了太多的打开/关闭会话、提交/回滚事务、驱逐/合并/持久化/保存/删除/更新对象的排列以在此处列出,但我尝试的所有操作都因一个错误或另一个错误而失败。我一直在参考 Hibernate 文档,但基本上我在这里是在黑暗中摇摆,因为我真的不明白我在做什么,所以欢迎任何建议。

【问题讨论】:

    标签: java database hibernate transactions robustness


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 谢谢!当我提交事务时,它真的会发生吗,还是我必须先刷新或关闭会话? IE。会话是否缓存事务并等到它关闭才真正将所有内容提交到数据库,或者我是否保证如果我提交事务,那么到目前为止的所有内容都已成功发送到数据库服务器?
    • 一次提交就是一次提交,在数据库中是一次提交的意思。它实际上已提交给数据库。默认情况下,提交事务还会在实际提交之前刷新所有挂起的写入。所以是的,如果您成功提交,那么到那时为止的所有内容都已发送到数据库服务器并由数据库提交。
    • 太棒了!使用您编写的内容,然后坐下来以清醒的头脑重新开始,我的一切都按照我想要的方式工作,并且代码非常简单。再次感谢!
    猜你喜欢
    • 2017-11-28
    • 1970-01-01
    • 2023-04-01
    • 2021-04-10
    • 1970-01-01
    • 2017-10-03
    • 2022-10-21
    • 2021-01-02
    • 2019-12-21
    相关资源
    最近更新 更多