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?
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
Yep :) Danke, jetzt fühle ich mich glücklich :) –