如何配置Hibernate以立即应用所有保存,更新和删除?

时间:2010-10-15 14:50:18

标签: java database hibernate

如何配置Hibernate在会话执行每个操作后立即将所有保存,更新和删除应用到数据库服务器?默认情况下,Hibernate将所有保存,更新和删除操作排入队列,并仅在flush()操作,提交事务或关闭发生这些操作的会话后将其提交到数据库服务器。

立即刷新数据库“写入”操作的一个好处是程序可以捕获并处理它们出现的代码块中的任何数据库异常(例如ConstraintViolationException)。使用延迟或自动刷新时,这些异常可能会在导致SQL操作的相应Hibernate操作之后很久发生。

更新

根据接口Session的Hibernate API文档,在会话结束之前捕获和处理数据库异常的好处可能完全没有任何好处:“如果会话抛出异常,则事务必须是回滚并且会话被丢弃。在发生异常后,Session的内部状态可能与数据库不一致。“

然后,使用try-catch块围绕“立即”Hibernate会话写操作的好处是在异常发生时立即捕获并记录异常。立即冲洗这些操作是否还有其他好处?

2 个答案:

答案 0 :(得分:9)

  

如何配置Hibernate在会话执行每个操作后立即将所有保存,更新和删除应用到数据库服务器?

据我所知,Hibernate没有为此提供任何便利。但是,它看起来像Spring,并且可以通过将FLUSH_EAGER HibernateTemplate分别转换为刷新模式HibernateInterceptor来进行一些数据访问操作source })。

但我热烈建议您仔细阅读javadoc (我会再回过头来看看)。

  

默认情况下,Hibernate将所有保存,更新和删除操作排入队列,并仅在执行flush()操作,提交事务或关闭发生这些操作的会话后将其提交到数据库服务器。

关闭会话不会刷新。

  

立即刷新数据库“写”操作的一个好处是程序可以捕获并处理它们出现的代码块中的任何数据库异常(例如ConstraintViolationException)。对于延迟或自动刷新,这些异常可能在导致SQL操作的相应Hibernate操作很久之后发生

首先,DBMS在插入(或更新)或后续提交(这称为立即约束或延迟约束)上是否返回约束时会有所不同。所以没有保证,你的DBA甚至可能不想要立即约束(尽管应该是默认行为)。

其次,我个人认为立即冲洗比利益更多的缺点,正如FLUSH_EAGER的javadoc中的白色黑色解释:

  

急切的冲洗导致立竿见影   与数据库同步,   即使在交易中。这导致   不一致出现并抛出一个   各自的例外,并且   参与的JDBC访问代码   同样的交易会看到   数据库已经更改   然后意识到他们。但缺点   是:

     
      
  • 与数据库进行额外的通信往返,而不是单一   在事务提交时批处理;
  •   
  • 如果Hibernate需要实际的数据库回滚这一事实   交易回滚(由于已经   提交的SQL语句)。
  •   

相信我,增加数据库往返并丢失语句批处理可能会导致主要性能下降

另外请记住,一旦你得到一个例外,除了抛弃你的会话之外你没有什么可做的。

总而言之,我很高兴Hibernate将各种操作排入队列,我当然不会将此EAGER_FLUSH flushMode用作一般设置(但可能只针对实际需要的特定操作)渴望,如果有的话。。

答案 1 :(得分:3)

虽然不推荐,但请查看autocommit。如果您的工作包含多个更新或插入SQL语句,则您自动提交某些工作,然后语句失败,您可能需要撤消操作的第一部分。当“撤销”操作失败时,它变得非常有趣。

无论如何,here's a link that shows how to do it