Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在EJB和Hibernate上下文中理解事务_Java_Hibernate_Ejb - Fatal编程技术网

Java 在EJB和Hibernate上下文中理解事务

Java 在EJB和Hibernate上下文中理解事务,java,hibernate,ejb,Java,Hibernate,Ejb,EJB默认处理事务管理,正如我所读到的,hibernate也处理事务。当我谈到事务时,我理解回滚数据库持久化操作之类的功能 我的问题是,对于同时使用EJB和Hibernate的应用程序,我们如何有选择地选择一个事务提供程序来支持?EJB和hibernate事务也可以同时工作吗?hibernate和EJB事务可以并且确实可以同时工作。默认情况下,当进行EJB调用时,调用将位于可以提交或回滚的EJB事务中。如果您碰巧在EJB调用(或MDB)中进行了hibernate调用,并且该事务被回滚,hiber

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


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

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
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)
示例#2-回滚事务:

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
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方法),默认情况下,它们都位于同一事务中。因此,整个调用层次结构必须成功完成,才能提交所有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
s来划分您的方法(即让容器完成繁重的工作)


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

有趣的问题,但英语不好-也许母语为英语的人可以帮上大忙。。。