2010-09-15 3 views
4

J'ai des entités JPA et j'ai besoin d'effectuer de la logique avec eux. Jusqu'à présent, une énorme classe de base de données statique a fait le travail. C'est moche parce que chaque méthode d'interface publique avait un équivalent privé qui utilisait EntityManager, pour effectuer des transactions. Mais je pourrais résoudre cela en ayant un em statique aussi! Cependant je me demande si c'est un design approprié, d'autant plus que la classe est responsable de beaucoup de choses. Pas étonnant, le code que j'ai trouvé en ligne de vrais projets n'était pas facile à comprendre (je pourrais alors aussi bien me rappeler mon code). Le code here est facile à comprendre, bien que peut-être plus générique? Quoi qu'il en soit, au-dessus de JDBC. Pourtant, perspicace, pourquoi utiliser des usines et des singletons pour les DAO?Qu'est-ce qu'une structure DAO appropriée avec jpa2/eclipselink?

J'ai bien de singletoning l'instance em comme suit:

private static final Map<String, EntityManager> ems = new HashMap<String, EntityManager>(); 
private final EntityManager em; 
private final EntityManagerFactory emf; 

public void beginTransaction() { 
    em.getTransaction().begin(); 
} 

public void commitTransaction() { 
    em.getTransaction().commit(); 
} 

public Database(final String persistenceUnitName) { 
    if(ems.containsKey(persistenceUnitName)){ 
     em = ems.get(persistenceUnitName); 
    }else{ 
     ems.put(persistenceUnitName, em = Persistence.createEntityManagerFactory(persistenceUnitName).createEntityManager()); 
    } 
    emf = em.getEntityManagerFactory(); 
    this.persistenceUnitName = persistenceUnitName; 
} 

Cette création de manière d'instances est standard, tout en maintenant un singleton Connexion/EntityManager. D'un autre côté, je me demandais s'il y avait le besoin de singleton ems en premier lieu? L'avantage est qu'avec plusieurs ems je rencontre des problèmes de verrouillage (sans utiliser em.lock()).

Une rétroaction? Tout code réel ou didacticiel qui illustre DAO avec JPA2 et eclipselink?

Répondre

3

Personnellement, je ne vois pas la valeur ajoutée de la protection EntityManager (qui est une implémentation du modèle Domain Store) avec un DAO et je l'utilise directement des services, à moins que le passage de l'APP est un événement probable. Mais, citant An interesting debate about JPA and the DAO:

Adam dit qu'il ne rencontrait que très peu de cas où un projet de fournisseur interverti les bases de données, et aucun cas où la persistance d'une chose déplacé différent d'un SGBDR. Pourquoi devriez-vous payer plus pour une chose que c'est improbable? Parfois, lorsque cela se produit, une solution plus simple peut avoir été payante et il peut s'avérer plus simple de réécrire un composant.

Je partage totalement le point de vue ci-dessus.

Quoi qu'il en soit, la question qui demeure ouverte est le cycle de vie de la EntityManager et la réponse dépend grandement de la nature de votre application (une application web, une application de bureau).

Voici quelques liens qui pourraient aider à décider ce qui serait approprié dans votre cas:

Et si vous voulez vraiment aller dans le sens de DAO, vous pouvez:

Questions connexes