简而言之......我有以下情况:
@Stateless
@Local(A.class)
@TransactionAttribute(TransactionAttributeType.MANDATORY)
Class A{
...
}
@Stateless
@Local({ B.class })
@Specializes
@TransactionAttribute(TransactionAttributeType.REQUIRED)
Class B extends A{
...
}
注释@TransactionAttribute(TransactionAttributeType.REQUIRED)
不适用于类B的方法。这些方法不会覆盖类A的方法,它们是公共的,并且是从客户端调用的。
恕我直言,这应该有效,但事实并非如此。似乎TransactionAttribute注释取自A类,似乎设置REQUIRED
事务类型的唯一方法是将注释放在方法级别。为什么
那是吗?
更新:我还注意到,甚至不一样(在我的情况下是MANDATORY)交易属性也可以。
谢谢!
答案 0 :(得分:0)
看看这个https://stackoverflow.com/a/5542890/2370742
EJB 3.1第13.3.7.1节也明确说明了规则 @TransactionAttribute:
如果bean类有超类,则遵循以下附加规则 应用
- 在超类S上指定的事务属性适用于由S定义的业务方法。如果是类级事务属性 在S上没有规定,它相当于
上的TransactionAttribute(REQUIRED)
的规格 S。- 可以在定义的商业方法M上指定交易属性>通过类S来重写方法M的交易属性值>在类S上显式或隐式指定。
根据这个,类级别的注释,只适用于这个类方法而不是它的子类。你必须在B级使用
@TransactionAttribute(TransactionAttributeType.MANDATORY)
Class A{
public void methodX1(){}
public void methodX2(){}
}
@TransactionAttribute(TransactionAttributeType.REQUIRED)
Class B extends A{
@TransactionAttribute(TransactionAttributeType.SUPPORTS)
public void methodX1(){
//supperts as defined in this method
}
public void methodX2(){
//mandatory as defined in superclass
}
public void methodX3(){
// required as defined in this class
}
}