Bonjour à tous,
Je vous expose un petit problème sur la conception d'un generic DAO offrant le CRUD basic partagé pour différent dao spécifique.
Je fait étendre ce dao à un autre dao pour y récupérer ces méthodes, mais les valeurs passé en paramètres ne transites pas.
La conception :
L'interface et la classe generic Dao
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 import java.util.List; public interface IDao<T, PK> { void persist(T entity); void remove(T entity); T merge(T entity); T find(PK id); List<T> findAll(); }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54 import java.lang.reflect.ParameterizedType; import java.util.List; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import javax.persistence.Query; import com.echange.dao.offre.IDao; public abstract class Dao<T, PK> implements IDao<T, PK> { protected Class<T> entityType; @PersistenceContext protected EntityManager entityManager; @SuppressWarnings("unchecked") public Dao() { ParameterizedType genericSuperclass = (ParameterizedType) getClass().getGenericSuperclass(); this.entityType = (Class<T>) genericSuperclass .getActualTypeArguments()[0]; } @Override public T find(PK id) { return entityManager.find(entityType, id); } @Override public void persist(T entity) { entityManager.persist(entity); } @Override public void remove(T entity) { entityManager.remove(entity); } @Override public T merge(T entity) { return entityManager.merge(entity); } @Override @SuppressWarnings("unchecked") public List<T> findAll() { String all = "select x from " + entityType.getSimpleName() + " x"; Query query = entityManager.createQuery(all); return query.getResultList(); } }
Un DAO voulant accéder à ces méthodes pour la persistence
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 public interface IOffreDAO extends IDao<Offre, Long> { public Offre getOffreById(Long id) throws PersistenceException; }Accès à la méthode find via ma couche domain
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43 package com.echange.dao.offre.impl; import java.util.ArrayList; import java.util.List; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import javax.persistence.PersistenceException; import javax.persistence.Query; import org.springframework.stereotype.Repository; import com.echange.dao.offre.IOffreDAO; import com.echange.model.offre.Offre; @Repository("offreDAO") public class OffreDAO extends Dao<Offre, Long> implements IOffreDAO{ @PersistenceContext private EntityManager em; @SuppressWarnings("unchecked") @Override public Offre getOffreById(Long id) throws PersistenceException { try{ System.out.println("OffreDAO getOffreById()"); Query query = em.createQuery("from Offre where id=:id"); query.setParameter("id",id); List<Offre> liC = (List<Offre>) query.getResultList(); if(liC.size() > 0) { return liC.get(0); }else { return null; } } catch (Throwable th) { throw new PersistenceException(th); } } }
fichier pour l'injection des dépendances.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 private IOffreDAO offreDAO; (avec getter et setter bien sur) .... .... DomainOffre() Offre off = (Offre)offreDAO.find(offre.getId());
Je le précise car j'ai rajouté la notion de "parent" me demandant que peut être c'était une cause qui manquait, mais non. Avec ou sans j'ai accès au méthodes du generic dao mais lorque j'appel la methode find(PK id), je pointe bien vers celle-ci mais le champ id n'est pas du tout remplis.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 <bean id="offreDAO" class="com.echange.dao.offre.impl.OffreDAO" parent="dao"/> <bean id="domainOffre" class="com.echange.Domain.Offre.impl.DomainOffre"> ..... <property name="offreDAO" ref="offreDAO"/> ..... </bean>
Je teste ça en debug, et je n'ai même pas :
id=null
j'ai :
id= le package = com.dao.offre.impl.Dao.find(Pk)
// pointe en fait vers mon dao offreDao (com.echange.dao.offre.impl) puis la méthodes hérités find du dao generic (Dao.find(Pk))
Avez-vous une idée de pourquoi les paramètres ne sont-ils pas passés ? je n'ai aucune valeur sur T est PK, qui doivent dans ce cas être T = Offre.class(Entité) et Pk = Long (valeur id)
la classe Dao (generic) ne serai initialisée ou bien ? pourtant elle y est car le constructeur Dao() me laisse des traces d'une création de chaque "entity" (la variable) pour chaque classe dao associé, lorsque je lance le serveur.
Auriez- vous une idée à ce sujet?
Merci
Ps : je n'ai pas tester les autres méthodes, mais si find(Pk id), ne marche déjà pas....
Partager