我正在阅读'Java Persistence with Hibernate'一书,并被困在第494页。我们通过设置hibernate.current_session_context_class to managed;
来扩展对话,这意味着现在我不能在我的方法中使用'jta (or javax.jta.UserTransaction)
'吗?
当我查看第494页的拦截器代码时,这种假设越来越强烈。在拦截器中,我们调用'session.beginTransaction
'表示我们正在使用Hibernate Transaction API来控制事务。
这是否意味着,我的实体不能使用UserTransaction.begin()/ commit()来控制交易?
我告诉这个,因为在本书的某处我甚至读过,当你使用UserTransaction来控制事务边界时,你不应该使用Hibernate Transaction API吗?
需要一些帮助。
答案 0 :(得分:5)
首先,恕我直言,你提到的这本书很棒,但现在有点过时了。但我可以肯定地猜测,你的问题是基于被称为“Hibernate中的语境会话”的问题。它基本上是关于您希望Hibernate管理事务范围的上下文。此上下文驱动sessionFactory.getCurrentSession()方法的机制。
hibernate.current_session_context_class的三种可能的配置:
此外:
现在看看这两个很棒的链接:
http://community.jboss.org/wiki/SessionsAndTransactions
http://community.jboss.org/wiki/OpenSessionInView
第一个用于更新明确信息,后者用于查看“托管”上下文的自定义实现。这将清除很多事情。反正:
我正在阅读'Java Persistence with Hibernate'这本书 卡在第494页。我们通过设置来扩展对话 hibernate.current_session_context_class来管理;这是否意味着现在 我不能在我的方法中使用'jta(或javax.jta.UserTransaction)'吗?
您可以 - 因为它是托管上下文,它将取决于您的自定义实现。
这是否意味着,我的实体无法使用 UserTransaction.begin()/ commit()来控制事务?
他们可以 - 实际上这正是你在“jta”和“线程”背景下所做的事情。