是否可以在远程EJB实现中使用TransactionManagementType.CONTAINER
而不是TransactionManagementType.BEAN
?
为了进一步说明,我不想在我的业务层中处理begin
和roolback
方法,但我没有找到另一种方法来使其工作。
我使用Glassfish 5和corbaname:iiop
协议来访问我的远程EJB。
使用示例:
此代码块在我的服务器上运行:
package br.com;
@Remote
interface IRemote {void method();}
@Stateless
@TransactionManagement(value = TransactionManagementType.BEAN)
class Remote implements IRemote {
@Resource
private UserTransaction ut;
void method(){
try{
ut.begin();
<my business logic>
ut.commit();
}
catch(Exception e){...}
}
此代码块在我本地计算机上的应用程序中运行:
@Stateless
class LocalBean {
@EJB(mappedName = "corbaname:iiop:myserver.com:3700#java:global/RemoteApp/Remote!br.com.IRemote"
private IRemote remote;
}
我跟踪了来自Oracle的package website,但它使用TransactionManagementType.BEAN
而没有任何解释。
有没有其他方法可以在不需要上述交易的情况下执行此操作?
答案 0 :(得分:0)
查看容器管理的交易
RequiresNew Attribute如果客户端在事务中运行 并调用企业bean的方法,容器接受 以下步骤:
暂停客户的交易
开始新交易
委托调用方法
方法完成后恢复客户端的事务
如果客户端未与事务关联,则为容器 在运行方法之前启动一个新事务。
如果要确保,请使用RequiresNew属性 该方法始终在新事务中运行。
答案 1 :(得分:0)
默认情况下(来自EJB规范)会话bean使用ContainerManagedTransaction,如果没有注释,则使用Required。 这应该是远程或本地的。
你也可以明确地做到
@TransactionManagement(value = TransactionManagementType.CONTAINER)
@Required
public class MyBean ... {
@Supported // override class level annotaion
public void method(...) {
}
}
从上面的错误消息中我假设您尝试使用TMType.BEAN但是在方法中添加了@Required左右,这被容器抑制,因为不允许组合!
答案 2 :(得分:0)
您需要从远程bean中完全删除@TransactionManagement
- 注释,然后默认为CMT。 UserTransaction
的使用将是非法的。所以你必须删除它,但那就是重点,不是吗?
但请注意:您可能会创建远程事务,这意味着两个容器可能使用XA协议进行同步。如果您不希望这样,请将TransactionAttribute
定义为TransactionAttributeType.REQUIRES_NEW
,然后您将拥有与以前相同的行为,而无需明确的用户事务。