了解EJB和Hibernate上下文中的事务

时间:2014-07-11 04:16:15

标签: java hibernate ejb

EJB默认处理事务管理,正如我所读,hibernate也处理事务。当我谈论一个事务时,我理解回滚数据库持久化操作就像功能一样。

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

1 个答案:

答案 0 :(得分:6)

Hibernate和EJB事务可以同时协同工作。默认情况下,在进行EJB调用时,调用将位于可以提交或回滚的EJB事务中。如果您碰巧在该EJB调用(或MDB)中进行了hibernate调用,并且该事务被回滚,那么hibernate数据库事务也将回滚。在这种情况下,当您执行事务提交时,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)

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

This Guide有很多关于交易和休眠的好信息。