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?
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);
}
}
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.
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.
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
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