JEE7: Tun, EJB-und CDI-beans-Unterstützung von container-managed Transaktionen?
Java EE7 besteht aus einer Reihe von "bean" - Definitionen:
- Managed Beans 1.0 (JSR-316 /JSR-250)
- Dependency Injection for Java 1.0 (JSR-330)
- CDI 1.1 (JSR-346)
- JSF Managed Beans 2.2 (JSR-344)
- EJB 3.2 (JSR-345)
Um loszuwerden, das chaos in meinem Kopf, ich Studien mehrere Artikel von "Verwendung der bean-Typ". Einer der Vorteile für EJB scheint zu sein, dass Sie allein deklarative Unterstützung von container-managed Transaktionen (die berühmten Transaktion Anmerkungen). Ich bin mir nicht sicher, ob dies korrekt ist. Kann das jemand genehmigen?
Inzwischen habe ich eine einfache demo-Anwendung, um zu überprüfen, ob dies tatsächlich wahr ist. Ich habe gerade definiert, die eine CDI-bean (nicht ein EJB - es hat keine Klasse Anmerkungen), wie folgt, basierend auf diese snippet:
public class CdiBean {
@Resource
TransactionSynchronizationRegistry tsr;
@Transactional(Transactional.TxType.REQUIRED)
public boolean isTransactional() {
return tsr.getTransactionStatus() == Status.STATUS_ACTIVE;
}
}
Nun, das Ergebnis auf GlassFish 4.0 ist, dass diese Methode tatsächlich gibt true zurück, welche, nach meinen Erkundigungen, ist nicht wie erwartet funktioniert. Habe ich erwarten, dass die container zu ignorieren, die @Transactional-annotation, die auf ein CDI-bean-Methode, oder sogar eine exception werfen. Ich benutze eine frisch installierte GlassFish-4-server, so gibt es keine Interferenzen.
Also meine Frage ist wirklich:
- Die bean-Typen tatsächlich Unterstützung von container-managed Transaktionen?
- Nur aus Gründen der Neugier, wie könnte ich es testen, mit einem einfachen demo-Anwendung, wenn der code oben ist falsch?
(BTW: Jemand beschrieb ein ähnliches problem hieraber seine Lösung nicht für meinen Fall.
InformationsquelleAutor der Frage SputNick | 2013-07-24
Du musst angemeldet sein, um einen Kommentar abzugeben.
Bis Java EE 7 nur EJB war die Transaktions-und die
@Transactional
annotation nicht vorhanden ist.Seit Java EE 7 und JTA 1.2 die Sie verwenden können, Transaktions-interceptor in CDI mit
@Transactional
annotation.Zur Beantwortung Ihrer Frage über die beste Art der bean zu verwenden, ist die Antwort CDI standardmäßig.
CDI Bohnen sind leichter als EJB und unterstützt eine Menge Features (darunter ein EJB) und ist standardmäßig aktiviert (wenn Sie hinzufügen
beans.xml
- Datei für Ihre app).Seit Java EE 6
@Inject
ersetzen@EJB
. Auch wenn Sie mit einem remote-EJBs (Funktion nicht vorhanden CDI) die best practice vorschlagen, dass Sie@EJB
einmal zu injizieren remote-EJB-und CDI-producer zu entlarven es als eine CDI-beanDasselbe ist vorgeschlagen, für die Java-EE-Ressourcen
Diese Hersteller werden verwendet, später
EJB weiterhin Sinn machen, für bestimmte Dienstleistungen, die Sie umfassen, wie JMS oder Asynchrone Behandlung, aber Sie werden als CDI-bean.
InformationsquelleAutor der Antwort Antoine Sabot-Durand
Den javadoc von Transaktions - sagt:
Also, deine Annahmen sind falsch. EJBs, bis Java EE 6 waren die einzigen Arten von Komponenten zur Unterstützung der deklarative Transaktionen. Die Transactional-annotation hat genau eingeführt in Java EE 7 zu machen, nicht-EJB, verwaltet der CDI-beans transaktional.
InformationsquelleAutor der Antwort JB Nizet