hibernate持久化方法 - “在事务之外调用”的含义

时间:2014-05-26 17:11:46

标签: hibernate

来自hibernate文档:

  

persist()使瞬态实例持久化。但事实并非如此   保证将标识符值分配给持久性   实例立即,分配可能发生在刷新时。   persist()还保证它不会执行INSERT语句   如果在事务边界之外调用它。这很有用   长时间运行的会话与扩展的会话/持久性   上下文。

这一行“persist()还保证如果在事务边界之外调用它,它将不会执行INSERT语句。”似乎令人困惑。如果我们调用了persist(),那么它已经是会话的一部分了。那为什么“交易之外”的问题到了?

由于

1 个答案:

答案 0 :(得分:0)

会话和事务生命周期仅对于每个请求的会话是相同的,尽管是最常用的会话管理模式。

但是,当跨多个Web请求重用Session时,Hibernate非常灵活,并且还支持长对话。这与使用statefull EJB的Java EE扩展持久化上下文类似。

在长时间的对话中,如果服务层客户端线程退出,则会释放数据库连接,并且会话不再自动刷新。

它是可以在可写事务中运行的最后一个请求,它将所有状态更改同步到数据库。