2016-04-27 8 views
0

Ich habe ein EJB mit 2 Methoden:Wie kann ich EJB-Transaktionen mikromanagen, wenn EJB-Methoden die Transaktionsattribute anderer Methoden ignorieren?

@Stateless 
public FooFacade implements FooFacadeRemote { 

    ... 

    @TransactionAttribute(javax.ejb.TransactionAttributeType.NEVER) 
    public void saveFoos(List<Foo> foos) { 
     for(Foo foo: foos) { 
      saveFoo(foo); 
     } 
    } 

    @TransactionAttribute(javax.ejb.TransactionAttributeType.REQUIRED) 
    private void saveFoo(Foo foo) { 
     em.persist(foo); 
    } 
} 

Ich habe gerade entdeckt, dass ein EJB seine eigenen Methoden Aufruf der TransactionAttributeType dieser Methoden ignoriert. Daher erhalte ich Ausnahmen, die für Transaktionen erforderlich sind, weil saveFoo den TransactionAttributeType als NIE sieht.

Ich verstehe, eine Abhilfe für dieses ist eine weitere Instanz des EJB bekommen die Aufgabe auszuführen:

@EJB(name = "FooFacade") 
private FooFacadeRemote self; 

@TransactionAttribute(javax.ejb.TransactionAttributeType.NEVER) 
public void saveFoos(List<Foo> foos) { 
    for(Foo foo: foos) { 
     self.saveFoo(foo); 
    } 
} 

Aber ist das wirklich notwendig? Ich meine, ich möchte nicht, dass saveFoo unbedingt öffentlich veröffentlicht wird.

Antwort

1

Sie benötigen keine separate EJB, Sie müssen die Methode nur über den EJB-Proxy aufrufen. Wenn dies ein staatenlos oder Singleton Session-Bean, nur eine EJB-Referenz auf den gleichen EJB:

@Stateless 
public class MyEJB implements MyEJBInterface { 
    @EJB MyEJBInterface self; 
    ... 

    @TransactionAttribute(javax.ejb.TransactionAttributeType.NEVER) 
    public void saveFoos(List<Foo> foos) { 
     for (Foo foo: foos) { 
      self.saveFoo(foo); 
     } 
    } 
} 

Wenn dies ein Stateful-Session-Bean ist, dann injizieren @Resource SessionContext, und verwenden Sie getBusinessInterface einen EJB-Proxy auf den gleichen Stateful zu erhalten Session-Bean-Instanz.

+0

Entschuldigung, das habe ich gemeint, als ich ein anderes EJB gesagt habe. Ich werde die ursprüngliche Frage aktualisieren. – wsaxton

+0

Dann ja, das ist deine einzige Option. Es gibt keine Möglichkeit, "private" EJB-Methoden zu verwenden. –