2013-07-03 12 views
6

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.
+0

Welche Version von Java EE? –

+0

Ich benutze EJB 3.1, Java 1.6, JPA 2.0 (EclipseLink) auf GlassFish 3.1 –

Antwort

5

Haben Sie den Beitrag von Adam Bien JPA/EJB3 KILLED THE DAO und DAOS AREN'T DEAD - BUT THEY EITHER COLLAPSED OR DISAPPEARED gesehen?

public abstract class AbstractFacade<E extends Serializable, 
            PK extends Serializable> { 

    private final transient Class<E> entityClass; 

    public AbstractFacade(final Class<E> entityClass) { 
     this.entityClass = entityClass; 
    } 

    protected abstract EntityManager getEntityManager(); 

    public void create(final E entity) { 
     final EntityManager entityManager = getEntityManager(); 
     entityManager.persist(entity); 
    } 

    public final E find(final PK id) { 
     return getEntityManager().find(entityClass, id); 
    } 

    // Other common operations 

} 

Und einen bestimmten Service:

@Stateless 
public class UserFacade extends AbstractFacade<User, String> { 

    @PersistenceContext(unitName = "MyPU") 
    private EntityManager em; 

    @Override 
    protected EntityManager getEntityManager() { 
     return em; 
    } 

    public UserFacade() { 
     super(User.class); 
    } 

    // Other methods of this service 

} 

Sehen Sie mehr in Java EE 6/7: The Lean Parts von JavaOne 2012 in San Francisco

In einer anderen Hand, können Sie eine abstrakte Klasse für die Service-Layer betrachten .

+0

In Ihrem Beispiel hängt Ihre Service-Schicht von JPA, was meiner Meinung nach eine schlechte Sache ist. Angenommen, Benutzer kommen von einem alten Mainframe, der sie auf einem FTP-Server "ablegt". Mit der DAO-Factory könnten Sie ein FTPUserDAO und JPAUserDAO haben, die Extent von UserDAO wären. So wie Sie es vorgeschlagen haben, müssten Sie eine komplett neue Service-Schicht für FTP haben. Was nun, wenn Sie einen wirklich komplexen Geschäftsalgorithmus für Ihre Benutzer haben? –

+1

Es gibt kein Problem. Sie können eine bestimmte Factory für Ihr Legacy-System erstellen und mit CDI einspielen. –

+0

Dem stimme ich nicht zu. Haben DAO und Services getrennt, ist meiner bescheidenen Meinung nach ein sicherer zu gehen.Dein letzter Link, am Anfang des Videos, sucht der Typ nach JSF JPA Tutorial und hat ein gutes Tutorial was genau ich brauche !!! http://wiki.eclipse.org/EclipseLink/Examples/JPA/JSF_Tutorial –

Verwandte Themen