2017-05-29 4 views
0

Was ist der beste Weg, um diesen Anwendungsfall zu implementieren?JavaEE EntityManager für lange Konversation

Image Ich habe eine EJB A, die eine Art Top-Business-Prozess-Aufrufer ist. Es ruft andere Bohnen an. Wenn während des Aufrufs anderer Beans eine Ausnahme auftritt, dann möchte ich alles zurücksetzen, was von der A erledigt wurde.

Ich würde Bild, um den EntityManager einmal in der A Bohne injizieren und dann an andere Bohnen übergeben. Es gilt als eine gute Praxis?

Antwort

1

Verwenden Sie den Container zur Verwaltung von Transaktionen wie hier beschrieben: https://docs.oracle.com/cd/E16439_01/doc.1013/e13981/servtran002.htm.

gäbe folgende Anmerkung auf Ihrer A-Bean-Klasse: @TransactionManagement (Wert = TransactionManagementType.CONTAINER)

Und die folgende Anmerkung für das Verfahren in A, die anderen Bohnen ruft: @TransactionAttribute (Wert = ERFORDERLICH)

Und stellen Sie sicher, dass andere Beans die Ausnahme auslösen, um die Transaktion rückgängig zu machen.

Dies ist nur ein einfacher Anwendungsfall und ich empfehle dringend, auf EJB Transaktionsverwaltung nachzulesen.

Beispiel:

@Stateless 
public static class A{ 

     @PersistenceContext(unitName="a") 
     private EntityManager em = null; 

     @Inject 
     private B b = null; 

     @TransactionAttribute(TransactionAttributeType.REQUIRED) 
     public void doInTransaction(){ 
      //get some data from em 
      //modify and save back to b 
      b.save(data); 
     } 
} 

public static class B{ 
     @PersistenceContext(unitName="a") 
     private EntityManager em = null; 

     public void save(data){ 
      //save against em 
      //catch JPA exception and throw back as RuntimeException 
     } 
} 
+0

Dank fot der Spitze. Ich habe schon etwas über das Transaktionsmanagement gelesen. Wenn ich es richtig verstehe, wenn ich die Transaktionsverwaltung verwende, dann ist die Injektion des Entity Managers Controller? So wie wenn ich Bohnen in mein 'A' injiziere, die Transaktionsverwaltung auf' A' spezifiziere und dann den Entity Manager in diese anderen Beans injiziere, dann wird die Injektion durch die Transaktionsverwaltung der 'A'-Bean gesteuert. Habe ich recht? –

+0

Die EntityManager-Injektion wird vom EJB-Container und nicht von der Transaktion gesteuert. Sie müssen EntityManager nicht an andere Beans übergeben, die A verwendet. Sie sollten EntityTManager wiederum beim Erstellen in den Container injizieren, es sei denn, Sie erstellen diese Beans manuell im Code über das Schlüsselwort "new". – tsolakp