Har*_*ana 2 java hibernate ejb
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
Run Code Online (Sandbox Code Playgroud)
示例#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)
Run Code Online (Sandbox Code Playgroud)
此外,如果要嵌套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
Run Code Online (Sandbox Code Playgroud)
示例#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)
Run Code Online (Sandbox Code Playgroud)
您可以通过自己管理事务来更改此行为,或者@TransactionAttribute如果您正在使用容器管理事务(即让容器执行繁重的工作),则通过使用s 划分方法来更改此行为.
本指南有很多关于事务和休眠的好信息.
| 归档时间: |
|
| 查看次数: |
1835 次 |
| 最近记录: |