IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JPA Java Discussion :

Generic DAO - pas d'accès Id sur find


Sujet :

JPA Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 85
    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 : 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....

  2. #2
    Membre émérite Avatar de slim
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2002
    Messages
    938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2002
    Messages : 938
    Par défaut
    Salut!
    Comment as-tu implémenté tes entités ?
    Faites une recherche sur le forum et/ou sur internet et lisez la doc officielle avant de poser une question svp.
    et n'oubliez pas de lire les FAQ !
    FAQ Java et les cours et tutoriels Java
    Doc JAVA officielle
    AngularJS 1.x
    Angular 2

    Do it simple... and RTFM !

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 85
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  4. #4
    Membre émérite Avatar de slim
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2002
    Messages
    938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2002
    Messages : 938
    Par défaut
    Quelle est l'exception renvoyée quand tu exécute ton merge ?
    Faites une recherche sur le forum et/ou sur internet et lisez la doc officielle avant de poser une question svp.
    et n'oubliez pas de lire les FAQ !
    FAQ Java et les cours et tutoriels Java
    Doc JAVA officielle
    AngularJS 1.x
    Angular 2

    Do it simple... and RTFM !

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 85
    Par défaut
    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.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 85
    Par défaut
    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

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 5
    Dernier message: 21/01/2013, 18h51
  2. Pas d'accès aux données sur téléphone
    Par Willy55 dans le forum Android
    Réponses: 7
    Dernier message: 30/05/2012, 16h32
  3. [AC-2003] Pb sur un etat pas d'accés aux propriétés
    Par merocean dans le forum IHM
    Réponses: 3
    Dernier message: 02/06/2009, 11h45
  4. Pas d'accès au code sur un Form
    Par stigma dans le forum IHM
    Réponses: 1
    Dernier message: 22/04/2008, 15h13
  5. pas d'acces au site web sur win2k3
    Par beepee dans le forum Windows Serveur
    Réponses: 3
    Dernier message: 19/10/2006, 09h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo