Méthode de L'OAC unique et méthode générique du CRUD (JPA / Hibernate + Spring)

suite à ma question précédente, Dao and Service layers (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 CRUD génériques a été proposée, mais je ne suis pas très sûr de savoir comment mettre en œuvre cela en utilisant JPA. Pourriez-vous me donner un exemple ou partager un lien sur cette question?

44
demandé sur Community 2010-10-08 11:42:31

5 réponses

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 mise en œuvre:

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);
    }
}
84
répondu Pascal Thivent 2010-10-08 10:56:15

basé sur l'article ne répétez pas le DAO nous avons utilisé ce genre 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 fait une grosse erreur.

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

économisez-vous une minute si vous appelez myDao.saveEntity au lieu de simplement entityManager.saveEntity ? Aucun. Vous aurez une classe DAO inutile qui ne fait rien d'autre que d'être un wraper around EntityManager. N'hésitez pas à écrire selects dans vos classes de service avec L'aide D'EntityManager (ou session en hibernation).

encore une remarque: vous devez définir les limites de votre couche service et ne pas laisser les programmeurs retourner ou attendre les classes Entity. L'INTERFACE utilisateur ou les programmeurs de la couche WS ne devraient pas connaître du tout les classes d'entity seulement les DTO-s. Les objets Entity 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 objet entity dans les données d'une session et que vous essayez de le mettre à jour quelques secondes ou heures plus tard dans la base de données. Eh bien, vous ne le feriez peut-être pas, mais un programmeur de L'UI qui connaît les types de paramètres et les types de retour de votre couche service seulement le ferait pour sauver quelques lignes de code.

14
répondu Balazs Zsoldos 2014-01-28 22:30:14

je cherchais la même chose. J'ai trouvé ce qui semble être exactement - le projet Spring-Data JPA fourni par SpringSource. C'est un port de code de Hadès et a maintenant (début 2011) été avalé par le printemps et mieux intégré. Il vous permet d'utiliser un seul dao (SimpleJpaRepository) avec une création statique, ou d'étendre la classe de base JpaRepository pour créer n'importe quel DAO spécifique à un objet avec des méthodes CRUD+ prêtes à l'emploi. 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); Cela semble très prometteur - faire partie des projets du printemps lui assurera certainement aussi un certain avenir. J'ai commencé à mettre en œuvre ceci dans mon prochain projet maintenant.

5
répondu Danny C 2011-03-10 15:24:32

si vous recherchez une implémentation par un tiers , vous pouvez vérifier http://www.altuure.com/projects/yagdao / . il s'agit d'un cadre d'OAD Générique basé sur une annotation qui prend en charge L'app et l'hibernation

2
répondu altuure 2010-11-03 10:35:23

vous pouvez aussi jeter un oeil à http://codeblock.engio.net/data-persistence-and-the-dao-pattern/

le code correspondant se trouve sur GitHub https://github.com/bennidi/daoism

il a une intégration avec des exemples de ressort et de configuration pour Hibernate et EclipseLink

1
répondu bennidi 2014-02-06 10:01:17