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?