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

Der*_*har 8 java database hibernate

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

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

更新:

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

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

Pas*_*ent 9

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

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

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

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

关闭会话不会刷新.

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

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

其次,我个人看到更多的缺点,立即冲洗而不是好处,正如javadoc中的白色黑色解释FLUSH_EAGER:

即使在事务中,急切刷新也会导致与数据库立即同步.这会导致出现不一致并立即抛出相应的异常,参与同一事务的JDBC访问代码将看到更改,因为数据库已经知道它们.但缺点是:

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

并且相信我,增加数据库往返并丢失语句的批处理可能会导致性能大幅下降.

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

总而言之,我很高兴Hibernate将各种操作排入队列,我当然不会将其EAGER_FLUSH flushMode用作一般设置(但可能仅适用于实际需要的特定操作,如果有的话).