2009-06-24 7 views
1

Considérant qu'il n'y a aucun @PersistenceContext disponible pour injecter l'EntityManager, plus vous devez gérer manuellement les Transactions, quelle est la meilleure façon de concevoir une telle application ?Comment concevoir pour JPA dans un serveur Web non EE Java (par exemple Tomcat)

Pour le EntityManagerFactory/EntityManager, autant que je peux voir, vous devez avoir chaque DAO acceptant un EntityManager dans le costructor par exemple.

public class DAOImpl implements DAO 
{ 
    private EntityManager em; 

    DAOImpl(EntityManager em){ 
     this.em = em; 
    } 

    //all CRUD operations follow 
} 

La première question qui se lève est quand vous appelez EntityManager # close()?

Point A: (en utilisant ThreadLocal) La façon dont je le vois, vous êtes mieux de faire cela dans un Filter à la fin du cycle de demande, ce qui implique que vous associez le EntityManager avec le thread courant

La deuxième question est, comment et quand injectez-vous l'EntityManager?

Considérant qu'il ya ServletContextListener où nous créons et fermer les EntityManagerFactory, nous pourrions avoir une méthode statique comme suit

public static EntityManager createEntityManager(){ 
return entityManagerFactory.createEntityManager(PERSISTENT_NAME); 
} 

mais puisque nous voulons créer le DAO encapsuler, on pourrait utiliser une usine par exemple

public class DAOFactory 
{ 
    public static DAO dao(){ 
    //return a new DAO 
    } 
} 

Comme par point A nous devrions utiliser un ThreadLocal pour créer le DAO en utilisant le EntityManager pour le thread en cours.

Pour la gestion des transactions. La meilleure façon de penser (qui imite la spécification JPA) est de créer votre propre annotation de transaction et d'utiliser la réflexion pour injecter les opérations begin/commit/rollback.

Vous devriez alors retourner un Proxy de la DAOFactory qui gère les transactions

Répondre

3

Je ne ferais pas tout ça. Pourquoi essayer de recréer toute la spécification JPA vous-même? Vous devez juste pouvoir utiliser JPA sans conteneur.

Le printemps peut vous aider avec ceci. Essayez-le.

+0

Je ne peux vraiment pas voir un point non plus, mais puisque ce sont les restrictions qui me sont imposées, je dois trouver un moyen de l'implémenter. – qnoid

Questions connexes