Java Hibernate刷新未为陈旧对象引发StalestateException(第一次刷新调用除外)

Java Hibernate刷新未为陈旧对象引发StalestateException(第一次刷新调用除外),java,hibernate,Java,Hibernate,我有一个复合ID的对象。程序正在执行以下操作 第一步。从数据库中读取对象 第二步。更改了密钥的1-2个字段。空白 第三步。调用flush()。它抛出一个StaleStateException 第四步。再次调用flush()。这不是投掷 StaleStateException用于一个案例,而用于其他案例 根据我的理解,如果一个过时的对象附加到会话,那么flush应该总是抛出StaleStateException,除非我们清除会话 是否有其他因素(明确因素除外)影响我的步骤4。我想知道为什么它不

我有一个复合ID的对象。程序正在执行以下操作

  • 第一步。从数据库中读取对象
  • 第二步。更改了密钥的1-2个字段。空白
  • 第三步。调用flush()。它抛出一个
    StaleStateException
  • 第四步。再次调用flush()。这不是投掷
    StaleStateException
    用于一个案例,而用于其他案例
根据我的理解,如果一个过时的对象附加到会话,那么flush应该总是抛出
StaleStateException
,除非我们清除会话

是否有其他因素(明确因素除外)影响我的步骤4。我想知道为什么它不为后续调用抛出
StaleStateException

来自:

如果会话引发异常(包括任何SQLException),请立即回滚数据库事务,调用Session.close()并放弃会话实例。某些会话方法不会使会话保持一致状态。Hibernate引发的任何异常都不能视为可恢复的。通过在finally块中调用close()确保会话将被关闭


您试图在抛出异常后使用会话,这将导致不可预测的行为,如文档所述。

感谢Tiny对其进行格式化。实际上,这是一个长时间运行的事务,抛出StaleStateException的对象对我们来说是可选的,这就是我们捕获异常并继续前进的原因。在一个案例中,它一直在工作。我试了45次,但在另一种情况下,每次都失败了。我怀疑还有其他一些因素也会影响这一点,可能是刷新会话。事务是否长,或者对象是否可选,这一事实不会改变任何事情:您使用会话的方式被明确记录为不可用。