【问题标题】:Understanding transaction in a context of EJB and Hibernate理解 EJB 和 Hibernate 上下文中的事务
【发布时间】:2014-07-11 04:16:14
【问题描述】:

默认情况下,EJB 处理事务管理,正如我所读到的,hibernate 也处理事务。当我谈论事务时,我对回滚数据库持久操作之类的功能的理解。

我的问题是我们如何有选择地选择一个事务提供程序来支持一个同时使用 EJB 和 Hibernate 的应用程序? EJB和hibernate事务也可以同时工作吗?

【问题讨论】:

  • 有趣的问题,但英语不好 - 也许以英语为母语的人可以帮助很多......

标签: java hibernate ejb


【解决方案1】:

Hibernate 和 EJB 事务可以同时一起工作。默认情况下,当进行 EJB 调用时,调用将在可以提交或回滚的 EJB 事务中。如果您碰巧在该 EJB 调用中(或在 MDB 中)进行了休眠调用,并且该事务被回滚,则休眠数据库事务也将回滚。在这种情况下,当你进行事务​​提交时,hibernate 也会提交数据库事务。

我的想法是这样的:一个 EJB 事务围绕着一个 Hibernate 数据库事务,而数据库事务依赖于要提交的 EJB 事务。如果 EJB 事务失败,那么数据库事务也会失败。如果 EJB 事务提交,数据库事务也会提交。

示例 #1 - 成功交易:

EJB method
   |--> Transaction Started
   |
   |--> Call persist method on Entity Manager instance
         |
         |--> SQL insert statement added to database transaction
   ...
   |--> EJB Transaction committed
         | --> SQL insert statement committed to database

示例 #2 - 回滚事务:

EJB method
   |--> Transaction Started
   |
   |--> Call persist method on Entity Manager instance
         |
         |--> SQL insert statement added to database transaction
   ...
   X--> EJB Transaction rolls back
         X --> Database transaction rolls back (insert not performed)

此外,如果您嵌套 EJB 调用(例如,一个 EJB 方法调用另一个),默认情况下,它们都存在于同一个事务中。因此,整个调用层次结构必须成功完成,以便提交所有 EJB 和 Hibernate 调用。

示例 #3 - 嵌套的 EJB 事务:

EJB method
|--> Transaction Started
|
|--> Call persist method on Entity Manager instance
    |--> SQL insert statement added to database transaction
    ...
    |--> Another EJB method called, *continues* same transaction
        |
        |--> EJB method successfully commits
    ...
    |--> EJB Transaction committed
        | --> SQL insert statement committed to database

示例 #4 - 带有回滚的嵌套 EJB 事务:

EJB method
|--> Transaction Started
|
|--> Call persist method on Entity Manager instance
    |
    |--> SQL insert statement added to database transaction
    ...
    |--> Another EJB method called, *continues* same transaction
        |
        X--> EJB method rolls back
    ...
    X--> EJB Transaction rolls back
        X --> Database transaction rolled back (insert not performed)

您可以通过自己管理事务来更改此行为,或者如果您使用的是容器管理事务(即让容器完成繁重的工作),则可以使用 @TransactionAttributes 划分您的方法。

This Guide 有很多关于事务和休眠的好信息。

【讨论】:

    猜你喜欢
    • 2015-11-26
    • 2012-10-07
    • 2016-06-10
    • 2017-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-30
    相关资源
    最近更新 更多