来自hibernate文档:
persist()将瞬态实例持久化。然而,事实并非如此保证将标识符值分配给持久对象实例,则赋值可能在刷新时发生。persist()还保证它不会执行INSERT语句如果在事务边界之外调用。这在以下方面很有用具有扩展会话/持久性的长时间会话上下文。
这行"persist()也保证如果在事务边界之外调用它,它将不会执行INSERT语句"似乎令人困惑。如果我们调用了persist(),那么它已经是会话的一部分。那么为什么会出现"交易之外"的问题呢?
谢谢
会话生命周期和事务生命周期只有在每个请求一个会话时才相同,尽管这是最常用的会话管理模式。
但是Hibernate是灵活的,它也支持长会话,当一个会话被多个web请求重用时。这类似于带有有状态EJB的Java EE扩展持久性上下文。
在长会话中,当客户端线程退出服务层时,db连接将被释放,并且会话不再自动刷新。
这是最后一个可以在可写事务中运行的请求,它将同步所有状态更改到db。