45 votes

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

Suite à ma question précédente, 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 sais pas trop comment la mettre en œuvre à l'aide de JPA. Pourriez-vous s'il vous plaît me donner un exemple ou partager un lien à ce sujet?

86voto

Pascal Thivent Points 295221

Voici un exemple d'interface:

 public interface GenericDao<T, PK extends Serializable> {
    T create(T t);
    T read(PK id);
    T update(T t);
    void delete(T t);
}
 

Et une implémentation:

 public class GenericDaoJpaImpl<T, PK extends Serializable> 
    implements GenericDao<T, PK> {

    protected Class<T> entityClass;

    @PersistenceContext
    protected EntityManager entityManager;

    public GenericDaoJpaImpl() {
        ParameterizedType genericSuperclass = (ParameterizedType) getClass()
             .getGenericSuperclass();
        this.entityClass = (Class<T>) 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);
    }
}
 

14voto

Balazs Zsoldos Points 1933

Fondée sur l'article Ne le répétez pas le DAO , nous avons utilisé ce genre de technique pour de nombreuses années. Nous avons toujours eu des problèmes avec nos modèles après nous avons réalisé que nous avons fait une grosse erreur.

À l'aide d'un outil ORM comme Hibernate ou JPA vous n'aurez pas à penser DAO et de la couche de Service séparément. Vous pouvez utiliser l'EntityManager de vos classes de service comme vous le savez le cycle de vie des transactions et la logique de vos classes d'entités de là.

Ne vous enregistrez toutes les minutes si vous appelez myDao.saveEntity au lieu de simplement entityManager.saveEntity? Pas de. Vous aurez inutile classe dao qui ne fait rien d'autre, mais sera un wrapper autour de l'EntityManager. Ne pas peur d'écrire sélectionne dans vos classes de service avec l'aide de l'EntityManager (ou de la session en mode veille prolongée).

Encore une remarque: Vous devez définir les frontières de votre couche de service et de ne pas laisser les programmeurs de retour ou d'attendre pour les classes d'Entité. L'INTERFACE utilisateur ou WS couche programmeurs devraient sais pas du tout sur les classes d'entité uniquement sur DTO-s. Objets de l'entité ont des cycles de vie que la plupart des programmeurs ne sais pas. Vous aurez vraiment de sérieux problèmes si vous stockez une entité de l'objet dans une session de données et d'essayer de le mettre à jour à la base de quelques secondes ou quelques heures plus tard. Eh bien, vous peut ne serait pas le faire, mais un programmeur de l'INTERFACE utilisateur qui sait les types de paramètres et types de retour de votre couche de service seulement faire pour enregistrer quelques lignes de code.

5voto

Danny C Points 2042

Je cherchais la même chose. J'ai trouvé ce qui semble être exactement ce que le Printemps de Données JPA projet fourni par SpringSource. C'est un code port de Hades et a maintenant (Début 2011) a été avalé par le Printemps et mieux intégrée. Il vous permet d'utiliser un seul dao (SimpleJpaRepository) avec un statique de créer ou d'étendre la base de JpaRepository classe pour créer n'importe quel objet spécifique de dao avec prêt CRUD+ méthodes. Permet également graal comme des requêtes en utilisant simplement les params noms que le nom de la méthode dans l'interface (pas de mise en œuvre requis!) c'est à dire findByLastname(String lastName); Semble très prometteur - être le cadre du Printemps des projets sera certainement assurer un avenir pour elle aussi. J'ai commencé à mettre en œuvre dans mon projet à venir maintenant.

2voto

altuure Points 95

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 les nnotations qui supporte JPA et hibernate

1voto

bennidi Points 734

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

Il a une intégration avec Spring et des exemples de configuration pour Hibernate et EclipseLink

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X