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;
	
}
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);
		}
	}
}
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
 
private IOffreDAO offreDAO; (avec getter et setter bien sur)
....
....
DomainOffre()
Offre off = (Offre)offreDAO.find(offre.getId());
fichier pour l'injection des dépendances.
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 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.

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....