2016-04-18 8 views
1

In der Oracle-Datenbank hat Entity Table eine Constraint-Prüfung (ID < 90). So löst die zweite persist-Methode SQLException aus.@TransactionAttribute (REQUIRED) verursacht keinen Effekt

Aber beide Code-Schnipsel unten funktionieren gleichermaßen: erste Persist-Methode nicht auch ohne JTA-Anmerkungen festgeschrieben. Warum funktionieren beide Varianten gleich?

@Stateless 
public class EntityServiceImpl implements EntityService{ 

@PersistenceContext 
private EntityManager enManager; 
@Resource 
private SessionContext sessionCtx; 

@TransactionAttribute(REQUIRED) 
public void updateEntity(List<Entity> entity) { 
    try { 
     Entity validEntity = entity.get(10); 
     enManager.persist(validEntity); 
     Entity inValidEntity = entity.get(90); 
     enManager.persist(inValidEntity); 

    } catch(Exception ex) { 
     sessionCtx.setRollbackOnly(); 
     throw ex; 
    } 
} 

an zweiter Stelle Schnipsel:

public void updateEntity(List<Entity> entity) { 
     Entity validEntity = entity.get(10); 
     enManager.persist(validEntity); 
     Entity inValidEntity = entity.get(90); 
     enManager.persist(inValidEntity); 
} 

persistence.xml

<persistence-unit name="WASLiberty" transaction-type="JTA"> 
    <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider> 
    <exclude-unlisted-classes>false</exclude-unlisted-classes> 
    <properties> 
     <property name="eclipselink.logging.level.sql" value="FINEST"/> 
     <property name="eclipselink.logging.parameters" value="true"/>  
    </properties> 
</persistence-unit> 

EDIT:

Von Oracle:

Erforderlich Attribut Wenn der Client innerhalb einer Transaktion ausgeführt wird und die Methode der Enterprise-Bean aufruft, wird die Methode in der Transaktion des Clients ausgeführt. Wenn der Client keiner Transaktion zugeordnet ist, startet der Container eine neue Transaktion, bevor die Methode ausgeführt wird.

Das Required-Attribut ist das implizite Transaktionsattribut für alle Enterprise-Bean-Methoden, die mit einer Container-verwalteten Transaktionsabgrenzung ausgeführt werden. In der Regel legen Sie das Required-Attribut nicht fest, es sei denn, Sie müssen ein anderes Transaktionsattribut überschreiben. Da Transaktion Attribute deklarativ sind, können Sie sie später leicht ändern

Ist es bedeutet, dass es keine Notwendigkeit zu erklären @TransactionAttribute ist (ERFORDERLICH), es sei denn wir ein anderes TransactionAttributeType außer „Required“ müssen?

+0

Ja, Sie haben im Grunde Ihre eigene Frage beantwortet :). 'REQUIRED' ist die Standardeinstellung für alle Stateless-Session-Beans. Sie ändern es nur, wenn Sie Standardverhalten benötigen. – rapasoft

+0

Yep :) Danke, jetzt fühle ich mich glücklich :) –

Antwort

1

Ja, Ihr Verständnis, dass @TransactionAttribute(REQUIRED) das Standardverhalten ist korrekt.

Für Session-Beans und MDBs ist diese Annotation standardmäßig impliziert. Sie gibt an, dass die Annotation wie im ersten Snippet nur ausführlich ist. Das einzige Mal, dass Sie wirklich eine @TransactionAttribute angeben müssen, ist, wenn Sie etwas anderes als REQUIRED für den Wert verwenden.