Précédent   Forum des professionnels en informatique > Java > Général Java > Persistance > JPA
JPA Forum d'entraide sur l'API de persistance JPA (Java Persistence API)
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 30/11/2011, 22h28   #1
Invité régulier
 
Inscription : juillet 2008
Messages : 30
Détails du profil
Informations forums :
Inscription : juillet 2008
Messages : 30
Points : 9
Points : 9
Par défaut Generic DAO - pas d'accès Id sur find

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 :
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 :
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 :
1
2
3
4
5
6
public interface IOffreDAO extends IDao<Offre, Long> {

	public Offre getOffreById(Long id) throws PersistenceException;
	
}
Code :
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 :
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 :
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....
zanteskuken est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 06/12/2011, 14h21   #2
Membre chevronné
 
Avatar de slim
 
Homme Salim Chami
Ingénieur développement logiciels
Inscription : décembre 2002
Messages : 651
Détails du profil
Informations personnelles :
Nom : Homme Salim Chami
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : Conseil

Informations forums :
Inscription : décembre 2002
Messages : 651
Points : 655
Points : 655
Salut!
Comment as-tu implémenté tes entités ?
slim est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/12/2011, 17h19   #3
Invité régulier
 
Inscription : juillet 2008
Messages : 30
Détails du profil
Informations forums :
Inscription : juillet 2008
Messages : 30
Points : 9
Points : 9
Citation:
Envoyé par slim Voir le message
Salut!
Comment as-tu implémenté tes entités ?
Bonjour Slim

Via JPA (2.0).

Exemple d'entête d'entité :

Code :
1
2
3
4
 
@Entity
@Table(name = "offre", catalog = "public", uniqueConstraints = @UniqueConstraint(columnNames = {"id"}))
public class Offre implements Serializable{
J'ai été un peut plus loin dans les test et certaines fois ça marche. C'est à dire.

Je réussis à retrouver une entité via la méthode find() (ça ne fonctionne pas toujours pour d'autre entité, bon, je me fixerai déjà sur une "fonctionnant", avançant petit à petit ).

La méthode persist fonctionne.

La méthode merge ne fonctionne pas.

Sur le peut d'entité testé.

C'est étrange que ce sois bancal comme ceci.

Merci de ton retour Slim, si tu avais une idée en tête à travers le type d'implémentation.
zanteskuken est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/12/2011, 17h23   #4
Membre chevronné
 
Avatar de slim
 
Homme Salim Chami
Ingénieur développement logiciels
Inscription : décembre 2002
Messages : 651
Détails du profil
Informations personnelles :
Nom : Homme Salim Chami
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : Conseil

Informations forums :
Inscription : décembre 2002
Messages : 651
Points : 655
Points : 655
Quelle est l'exception renvoyée quand tu exécute ton merge ?
slim est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/12/2011, 16h00   #5
Invité régulier
 
Inscription : juillet 2008
Messages : 30
Détails du profil
Informations forums :
Inscription : juillet 2008
Messages : 30
Points : 9
Points : 9
Salut Slim,

Je reviens quelques jours après ta réponse car je n'ai plus eus de problème avec ce generic DAO et j'attendais quelques test pour en être sur.

J'ai surtout l'impression que Eclipse à dût encore se crasher à travers sa compilation et fichier généré à part car je n'ai vraiment modifier de chose et ces derniers temps tout à fonctionné, ainsi que l'intégration total de mes entités via ce DAO. ça reste énervant du coup.

J'attends encore un peut de temps pour me donner confirmation, mais actuellement ça à marché du jour au lendemain (l'ordinateur à dut bien dormir -_-).

Ps : désolé, je n'avais encore associé d'exception à la méthode merge et donc je n'ai pu voir ce qu'il en était à l'époque.
zanteskuken est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/12/2011, 10h41   #6
Invité régulier
 
Inscription : juillet 2008
Messages : 30
Détails du profil
Informations forums :
Inscription : juillet 2008
Messages : 30
Points : 9
Points : 9
Après une semaine, je n'ai toujours pas de souci. Cela fonctionne bien. Je mets donc le post en Résolu.

Ps : j'ai forcé "Pk" au type Object et je n'ai plus que " extends IDao<T>"

T find(Object id);

Ps : La méthode find

public T find(final Object id) {
return (T) entityManager.find(entityType, id);
}

Passer T en paramètre.

Ps : Pk en paramètre marcherai aussi sans doute.

Merci de tes retour Slim
zanteskuken est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 19h34.


 
 
 
 
Partenaires

Hébergement Web