Hibernate persist方法文档中的"called outside of transaction"是什么意思?

3

来自Hibernate文档:

persist() 方法能够将瞬时状态的实例变为持久状态。但是,它不保证标识符会立即赋值给持久状态下的实例,此赋值可能在刷新时发生。如果在事务边界之外调用 persist() 方法,它也保证不会执行插入语句。这在带有扩展 Session/持久化上下文的长时间对话中非常有用。

这行话 “如果在事务边界之外调用 persist() 方法,它也保证不会执行插入语句。” 看起来让人困惑。如果我们已经调用了 persist() 方法,那么它已经成为该 session 的一部分。那么,“事务边界之外” 这个问题为什么会出现?

谢谢!

1个回答

1

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

但Hibernate非常灵活,也支持长时间交互,当一个会话在多个Web请求中被重复使用时。这类似于具有状态EJB的Java EE扩展持久化上下文。

在长时间交互中,当客户端线程退出服务层时,DB连接将被释放,并且会话不再自动刷新。

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


事务之外是什么意思?这是否意味着在执行session.getTransaction().commit()后执行的代码? - light_ray
它意味着未在begin/end调用中执行的代码。 - Vlad Mihalcea
@VladMihalcea,您能否解释一下我的类似问题-https://dev59.com/Jrf3oIgBc1ULPQZF_zvx#71699404,谢谢。 - Shweta Priyadarshani

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接