Dies ist ein Architekturproblem, das ich derzeit habe. Ich brauche Hilfe bezüglich der besten Praktiken bei der Integration von EJB und JPA in ein Projekt. Ich möchte EJBs haben, die die Aufgabe der Service-Schicht übernehmen und die Geschäftslogik meiner Anwendung enthalten. Genau darunter würde ich gerne eine DAO-Ebene haben, die meine EJBs benutzen werden, indem sie eine DAO-Fabrik benutzen, um diese beiden Schichten so weit wie möglich zu trennen. Wenn ich das weiß, kann ich meine DAO natürlich nicht als EJBs erstellen, weil ich nicht möchte, dass sie automatisch injiziert werden, da ich möchte, dass sie durch die Fabrik erstellt werden. Das führt mich die EntityManager manuell JPA mit EJB mit getrennten DAO- und Service-Layern
Persistence.createEntityManagerFactory("PortalEJB").createEntityManager();
Jetzt mit
erstellen ... dieser Aufruf in meiner abstrakten JPA DAO befindet:public abstract class JPADataAccessorObject<K, E> implements DataAccessorObject<K, E> {
protected Class<E> entityClass;
protected EntityManager entityManager;
protected JPADataAccessorObject(Class<E> pEntityClass) {
this.entityManager = Persistence.createEntityManagerFactory("PortalEJB").createEntityManager();
this.entityClass = pEntityClass;
}
/* Other DAO functions (update, delete, create) */
}
Ich denke, das schlecht ist, ist es nicht? Alle meine konkreten Erweiterungen dieser Klasse werden eine brandneue Kopie des Persistenzkontextes haben und ich werde seltsames Verhalten bekommen. Außerdem, wenn ich das mache, denke ich Ich muss die Transaktionen selbst in der Service-Schicht verwalten. Ich war über Aspekte für das schaffen, so etwas wie:
- Transaktion erstellen, bevor Sie Funktion des Service-Layer/Verfahren
- (die Transaktion Rollback, wenn eine Ausnahme auftritt)
- Commit die Transaktion nach jeder Funktion der Dienstschicht
- Wie soll ich manag:/Verfahren
hier So sind meine Fragen e der EntityManager?
- Sollte ich eine Art von JPA-Dienstprogramm-Klasse haben, die es verwaltet, eine Kopie von Multithreading geschützt zu haben?
- Wenn ich einen schrecklichen Fehler mache, geben Sie bitte Best Practices an.
Welche Version von Java EE? –
Ich benutze EJB 3.1, Java 1.6, JPA 2.0 (EclipseLink) auf GlassFish 3.1 –