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 :

Probleme pour faire un DAO Generique


Sujet :

JPA Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 38
    Par défaut Probleme pour faire un DAO Generique
    Bonjour,

    Tout d'abord, je ne sais pas si je suis sur le bon forum, mais vu que C'ets un soucis de DAO ... je tente ce sous-forum.

    Bon l'idée c'est que j'ai des Entity, que je dois implementer un DAO.
    Du coup, je me suis dit : DAOGenerique !!!

    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
     
    public class GenericDao<T>{ // implements IGenericDao<T>{
     
    	@PersistenceContext(unitName = "parentDao")
    	EntityManager entityMgr;
     
    	private T type;
     
    	public GenericDao(T type) {
    		this.type = type;
    	}
     
    	public void delete(T c) throws DAOException {
    		try{
    			entityMgr.remove(c);
    		}catch(Exception e){
    			throw new DAOException("Error : Unable to delete object");
    		}
    	}
     
    	public T getById(int id) throws DAOException {
    		try{
    			entityMgr.find(this.type.class, id);
    			return null;
    		}catch(Exception e){
    			throw new DAOException("Error : Unable to find an object");
    		}
    	}
     
    	public Collection<T> getList() throws DAOException {
    		// TODO Auto-generated method stub
    		return null;
    	}
     
     
    	public void save(T c) throws DAOException {
    		entityMgr.persist(c);
     
    	}
     
    	public void update(T c) throws DAOException {
    		entityMgr.refresh(c);
     
    	}
    }

    Bon le soucis se situe ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    	public T getById(int id) throws DAOException {
    		try{
    			entityMgr.find(this.type.class, id);
    			return null;
    		}catch(Exception e){
    			throw new DAOException("Error : Unable to find an object");
    		}
    	}
    En effet j'utilise la persistance des EJB avec l'entityManager et la signature de la fonction find c'est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find(Class<T>, object o)
    Bref j'arrive pas à obtenir le premier argument de cette méthode ...
    J'ai tenté plein de trucs ... mais là j'ai plus d'idées ...

    Quelqu'un à déjà rencontré ce problème ? Quelqu'un à une idée ?

    Emilien

  2. #2
    Membre expérimenté Avatar de mOuLi
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2008
    Messages
    170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2008
    Messages : 170
    Par défaut
    Tu peux pas faire quelque chose comme ça ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public T getById(Object id) throws DAOException {
      try{
        return (T)entityMgr.find(T.class, id);
      }catch(Exception e){
        throw new DAOException("Error : Unable to find an object");
      }
    }
    Et du coup il n'est plus nécessaire d'avoir le constructeur public GenericDao(T type)

  3. #3
    Membre Expert

    Homme Profil pro
    Architecte logiciel
    Inscrit en
    Novembre 2006
    Messages
    1 252
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte logiciel
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 252
    Par défaut
    Pas possible. Il faut passer l'instance de Class<T> en constructeur.

    Le DAO Generique est un grand classique qui a déjà été implémenté plusieurs fois, ici par exemple: http://www.dhptech.com/node/18

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 38
    Par défaut
    Okay merci je vais essayer de voir, mais ca me semble plus complexe que ce que j'envisage. C'est peut être par ce que je veux réutiliser l'entity manager et que c'est pas une "bonne pratique" ?

    <Sinon juste une question sur l'exemple que tu m'a passé, dans le DAO generique



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Public abstract class GenericDaoHibernate<T,I extends Serializable> implements GenericDao<T,I> {
     
    [...]
    private Class<? extends T> clazz;
     
    [...]
    Pourquoi on ne fait pas juste :
    private Class<T> clazz; ?

  5. #5
    Membre éclairé

    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 298
    Par défaut
    Tu trouveras un exemple d'implémentation d'un DAO générique sur le site du livre Hibernate In action
    http://www.hibernate.org/400.html
    Télécharge CaveatEmptor JPA/EJB 3.0

  6. #6
    Membre Expert

    Homme Profil pro
    Architecte logiciel
    Inscrit en
    Novembre 2006
    Messages
    1 252
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte logiciel
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 252
    Par défaut
    Citation Envoyé par Azounet Voir le message
    <Sinon juste une question sur l'exemple que tu m'a passé, dans le DAO generique



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Public abstract class GenericDaoHibernate<T,I extends Serializable> implements GenericDao<T,I> {
     
    [...]
    private Class<? extends T> clazz;
     
    [...]
    Pourquoi on ne fait pas juste :
    private Class<T> clazz; ?
    Probablement pour pouvoir définir un DAOGenerique sur une interface et à l'instanciation passer le type concret (Class<? extends T>).

  7. #7
    Expert confirmé
    Avatar de djo.mos
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    4 666
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 4 666
    Par défaut
    Bonjour,
    Théoriquement, c'est pas possible de retrouver la classe depuis un générique.
    Pratiquement, J'ai utilisé un certain momenet ce bout de code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    this.type = (Class<T>) ((ParameterizedType) getClass()
    				.getGenericSuperclass()).getActualTypeArguments()[0];
    Mais il n'est pas garanti de toujours fonctionner.

    Bref, la solution la plus propore serait de passer la class au constructeur.

Discussions similaires

  1. [tomcat]probleme pour faire marche des .shtml
    Par Battosaiii dans le forum Tomcat et TomEE
    Réponses: 1
    Dernier message: 27/03/2006, 20h08
  2. Probleme pour faire une somme sous Excel
    Par Nicolas92 dans le forum Excel
    Réponses: 5
    Dernier message: 02/12/2005, 11h38
  3. Probleme pour faire une somme dans header ??
    Par snoop57 dans le forum Access
    Réponses: 7
    Dernier message: 01/12/2005, 13h40
  4. 2 problemes pour faire un menu en CSS
    Par Death83 dans le forum Mise en page CSS
    Réponses: 1
    Dernier message: 12/08/2005, 08h23
  5. Réponses: 7
    Dernier message: 16/04/2005, 08h55

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