如果类扩展另一个具有不同@TransactionAttribute类型

时间:2015-05-11 04:38:49

标签: transactions jboss7.x javabeans java-ee-7

简而言之......我有以下情况:

@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)交易属性也可以。

谢谢!

1 个答案:

答案 0 :(得分:0)

看看这个https://stackoverflow.com/a/5542890/2370742

  

EJB 3.1第13.3.7.1节也明确说明了规则   @TransactionAttribute:

     

如果bean类有超类,则遵循以下附加规则   应用

     
      
  • 在超类S上指定的事务属性适用于由S定义的业务方法。如果是类级事务属性   在S上没有规定,它相当于
    的规格   S。
  • 上的TransactionAttribute(REQUIRED)   
  • 可以在定义的商业方法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
  }
}