Méthodes DAO et CRUD uniques (JPA / Hibernate + Spring)

Suite à ma question précédente, les couches DAO et Service (JPA / Hibernate + Spring) , j’ai décidé d’utiliser un seul DAO pour ma couche de données (au moins au début) dans une application utilisant JPA / Hibernate, Spring et Wicket. L’utilisation de méthodes génériques CRUD a été proposée, mais je ne suis pas très sûr de savoir comment l’implémenter en utilisant JPA. Pourriez-vous me donner un exemple ou partager un lien à ce sujet?

Voici un exemple d’interface:

public interface GenericDao { T create(T t); T read(PK id); T update(T t); void delete(T t); } 

Et une implémentation:

 public class GenericDaoJpaImpl implements GenericDao { protected Class entityClass; @PersistenceContext protected EntityManager entityManager; public GenericDaoJpaImpl() { ParameterizedType genericSuperclass = (ParameterizedType) getClass() .getGenericSuperclass(); this.entityClass = (Class) genericSuperclass .getActualTypeArguments()[0]; } @Override public T create(T t) { this.entityManager.persist(t); return t; } @Override public T read(PK id) { return this.entityManager.find(entityClass, id); } @Override public T update(T t) { return this.entityManager.merge(t); } @Override public void delete(T t) { t = this.entityManager.merge(t); this.entityManager.remove(t); } } 

Basé sur l’article Ne pas répéter le DAO, nous avons utilisé ce type de technique pendant de nombreuses années. Nous avons toujours eu des problèmes avec nos modèles après avoir réalisé que nous avions commis une grosse erreur.

En utilisant un outil ORM tel que Hibernate ou JPA, vous n’aurez pas à penser séparément à la couche DAO et à la couche Service. Vous pouvez utiliser EntityManager à partir de vos classes de service lorsque vous connaissez le cycle de vie des transactions et la logique de vos classes d’entités.

Est-ce que vous économisez des minutes si vous appelez myDao.saveEntity au lieu de entityManager.saveEntity ? Vous aurez une classe dao inutile qui ne fait rien d’autre, mais sera une enveloppe autour de EntityManager. N’ayez pas peur d’écrire des sélections dans vos classes de service à l’aide d’EntityManager (ou d’une session en hibernation).

Une autre remarque: vous devez définir les bordures de votre couche de service et ne pas laisser les programmeurs retourner ou attendre les classes d’entités. Les programmeurs de couche d’interface utilisateur ou WS ne devraient pas savoir du tout sur les classes d’entités uniquement sur les DTO-s. Les objects d’entité ont des cycles de vie que la plupart des programmeurs ne connaissent pas. Vous aurez des problèmes très sérieux si vous stockez un object entité dans une session de données et essayez de le mettre à jour dans la firebase database secondes ou heures plus tard. Eh bien, vous ne pouvez pas le faire, mais un programmeur de l’interface utilisateur qui connaît les types de parameters et les types de retour de votre couche de service ne ferait que pour enregistrer certaines lignes de code.

Je cherchais la même chose. J’ai trouvé ce qui semble être exactement cela – le projet JPA Spring-Data fourni par SpringSource. Ceci est un port de code de Hades et a (début 2011) été avalé par Spring et mieux intégré. Il vous permet d’utiliser un seul dao (SimpleJpaRepository) avec une création statique, ou d’étendre la classe JpaRepository de base pour créer un dao spécifique à un object avec des méthodes CRUD + prêtes à l’emploi. Autorise également les requêtes de type grails simplement en utilisant les noms params comme nom de la méthode dans l’interface (aucune implémentation requirejse!) findByLastname(Ssortingng lastName); Cela semble très prometteur – faire partie des projets de spring assurera certainement un avenir pour elle aussi. J’ai commencé à l’implémenter dans mon projet à venir maintenant.

Si vous recherchez une implémentation tierce, vous pouvez consulter http://www.altuure.com/projects/yagdao/ . c’est un framework DAO générique basé sur nnotation qui supporte JPA et hibernate

Vous pouvez également consulter http://codeblock.engio.net/data-persistence-and-the-dao-pattern/

Le code correspondant peut être trouvé sur github https://github.com/bennidi/daoism

Intégration avec Spring et exemples de configuration pour Hibernate et EclipseLink