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

Hibernate Java Discussion :

Identifiant toujours à 0


Sujet :

Hibernate Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2007
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2007
    Messages : 28
    Par défaut Identifiant toujours à 0
    Bonjour !

    Voici l'état de mon code (problème décrit ci-après) :

    Code de la classe parente de mes objets du domaine :
    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
     
    package com.projet.domaine;
     
    public abstract class ObjetProjet
    {
        private Reference reference;
     
        //    public int getReference()
        //    {
        //        return reference;
        //    }
        //
        //    public void setReference(int aReference)
        //    {
        //        reference = aReference;
        //    }
     
        public Reference getReference()
        {
            return reference;
        }
     
        public void setReference(Reference aReference)
        {
            reference = aReference;
        }
     
        public void setReference(int aReference)
        {
            reference = new Reference(aReference);
        }
     
        public boolean isNouveau()
        {
            return reference == null || Reference.NEW_REFERENCE.equals(reference);
        }
     
    }
    Code de ma classe Reference (permettant de gérer les identifiants) :
    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
     
    package com.projet.domaine;
     
    import java.io.Serializable;
     
    public class Reference implements Serializable
    {
     
        private static final long serialVersionUID = 1L;
     
        // Référence static qui prend la valeur maximale d'un int.
        public final static Reference NEW_REFERENCE = new Reference(2147483647);
     
        private int value;
     
        public int getValue()
        {
            return value;
        }
     
        public void setValue(int aValue)
        {
            value = aValue;
        }
     
        // privé pour ne pas pouvoir être appelé depuis l'exterieur.
        //    @SuppressWarnings("unused")
        private Reference()
        {
     
        }
     
        public Reference(int aValue)
        {
            value = aValue;
        }
     
        @Override
        public String toString()
        {
            return String.valueOf(value);
        }
     
    }
    Code de ma classe Adresse :
    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
    55
    56
    57
    58
    59
    60
    61
    62
    63
     
    package com.projet.domaine;
     
    import java.util.Locale;
     
    public class Adresse extends ObjetProjet {
    	private String numeroDeRue;
    	private String rue;
    	private String ville;
    	private String codePostal;
    	private String pays;
     
    	public String getNumeroDeRue() {
    		return numeroDeRue;
    	}
     
    	public void setNumeroDeRue(String aNumeroDeRue) {
    		numeroDeRue = aNumeroDeRue;
    	}
     
    	public String getRue() {
    		return rue;
    	}
     
    	public void setRue(String aRue) {
    		rue = aRue;
    	}
     
    	public String getVille() {
    		return ville;
    	}
     
    	public void setVille(String aVille) {
    		ville = aVille;
    	}
     
    	public String getCodePostal() {
    		return codePostal;
    	}
     
    	public void setCodePostal(String aCodePostal) {
    		codePostal = aCodePostal;
    	}
     
    	public String getPays() {
    		return pays;
    	}
     
    	public void setPays(String aPays) {
    		pays = aPays;
    	}
     
    	@Override
    	public String toString() {
    		String vRet = numeroDeRue + " " + rue + "\n" + codePostal + " "
    				+ ville.toUpperCase(Locale.FRANCE);
    		if (pays != null && !"".equals(pays)) {
    			vRet += " (" + pays + ")";
    		}
    		return vRet;
    	}
     
    }
    Ma classe gérant mes services (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
    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
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
     
    package com.projet.service;
     
    import org.hibernate.ObjectNotFoundException;
    import org.hibernate.SessionFactory;
    import org.hibernate.cfg.Configuration;
    import org.hibernate.classic.Session;
     
    import com.projet.domaine.ObjetProjet;
    import com.projet.domaine.Reference;
     
    public abstract class Service<T extends ObjetProjet>
    {
     
        private Configuration configuration;
        private SessionFactory sessionFactory;
        private Session session;
     
        /**
         * Permet d'initialiser la connexion à la base de données.
         * Attention, cet appel ouvre une connexion. Toute connexion ouverte doit OBLIGATOIREMENT être fermée
         */
        public void initialiserConnexion()
        {
            if (configuration == null)
            {
                configuration = new Configuration().configure("hibernate.cfg.xml");
                sessionFactory = configuration.buildSessionFactory();
            }
            initSession();
        }
     
        /**
         * Permet de fermer la connexion avec la base de données.
         * Il est important de toujours fermer la connexion si celle-ci n'est plus utilisée.
         */
        public void fermerConnexion()
        {
            session.close();
        }
     
        /**
         * Synchronise les données avec la base de données. Les données modifiées sur l'objet seront enregistrées après cela.
         */
        protected void commit()
        {
            session.getTransaction().commit();
        }
     
        /**
         * Permet d'ouvrir une transaction.
         * /!\ ATTENTION : les transactions doivent être gérées de manière précautionneuse
         */
        protected void begin()
        {
            session.beginTransaction();
        }
     
        /**
         * Permet d'initialiser la session à partir de l'usine de session.
         * Il faudra donc penser à fermer la connexion après cet appel.
         */
        private void initSession()
        {
            session = sessionFactory.openSession();
        }
     
        /**
         * Renvoie la session hibernate. Elle permet de se connecter à la base de données.
         * @return La session hibernate.
         */
        public Session getSession()
        {
            return session;
        }
     
        /**
         * Permet de récupérer un objet depuis la base de données avec son identifiant
         * @param aId L'identifiant de l'objet en base
         * @return L'objet dûement rempli avec les valeurs de la base de données.
         */
        public T get(Reference aId)
        {
            T vRet;
            try
            {
                vRet = (T) session.load(getGenericClass(), aId);
            }
            catch (ObjectNotFoundException e)
            {
                vRet = null;
            }
            return vRet;
        }
     
        /**
         * Méthode renvoyant la classe générique. En effet, il n'est pas possible d'avoir la classe du générique à partir du générique lui même
         * L'appel de cette méthode permet donc de contourner ce problème
         * @return la Class de l'objet générique que traite le Service.
         */
        public abstract Class getGenericClass();
     
    }
    Mon service spécifique aux Adresses :
    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
     
     
    package com.projet.service.unitaire.implementation;
     
    import com.projet.domaine.Adresse;
    import com.projet.service.Service;
    import com.projet.service.unitaire.AdresseServiceUnitaire;
     
    public class AdresseServiceUnitaireImpl extends Service<Adresse> implements AdresseServiceUnitaire
    {
     
        @Override
        public void begin()
        {
            super.begin();
        }
     
        @Override
        public void commit()
        {
            super.commit();
        }
     
        @Override
        public Class getGenericClass()
        {
            return Adresse.class;
        }
     
    }
    Mon main :
    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
     
    package com.projet;
     
    import com.projet.domaine.Adresse;
    import com.projet.domaine.Reference;
    import com.projet.service.unitaire.implementation.AdresseServiceUnitaireImpl;
     
    public class Test
    {
     
        /**
         * @param args
         */
        public static void main(String[] args)
        {
            AdresseServiceUnitaireImpl vAdresseServiceUnitaireImpl = new AdresseServiceUnitaireImpl();
            vAdresseServiceUnitaireImpl.initialiserConnexion();
            vAdresseServiceUnitaireImpl.begin();
            //        Adresse vAdresse = new Adresse();
            //        vAdresse.setCodePostal("27350");
            //        vAdresse.setNumeroDeRue("5");
            //        vAdresse.setPays("FRANCE");
            //        vAdresse.setReference(Reference.NEW_REFERENCE);
            //        vAdresse.setRue("rue de la Mare Mande");
            //        vAdresse.setVille("ROUTOT");
            //        vAdresse.setReference(1);
            //        vAdresseServiceUnitaireImpl.getSession().save(vAdresse);
            //        vAdresseServiceUnitaireImpl.getSession().getTransaction().commit();
            Adresse vAdresse = vAdresseServiceUnitaireImpl.get(new Reference(1));
            System.out.println("L'adresse retrouvée est : \n" + vAdresse);
            vAdresseServiceUnitaireImpl.fermerConnexion();
     
        }
     
    }
    Et enfin mes deux fichiers de configurations :
    D'abord hibernate.cfg.xml :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
    <hibernate-configuration>
      <session-factory>
        <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="hibernate.connection.url">jdbc:mysql://etourneaumo.no-ip.biz/Projet</property>
        <property name="hibernate.connection.username">etourneaumo</property>
        <property name="hibernate.connection.password">MotDeP@$$e</property>
        <mapping resource="com/projet/domaine/Adresse.hbm.xml"/>
      </session-factory>
    </hibernate-configuration>
    Et mon fichier de mapping pour Adresse :
    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
     
    <?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
    <hibernate-mapping>
    	<class name="com.projet.domaine.Adresse" table="_Adresse">
    		<id name="reference" type="serializable" column="reference">
    			<generator class="assigned"/>
    		</id>
    		<property name="numeroDeRue" type="string" not-null="false" />
    		<property name="rue" type="string" not-null="false" />
    		<property name="ville" type="string" not-null="false" />
    		<property name="codePostal" type="string" not-null="false" />
    		<property name="pays" type="string" not-null="false" />
    	</class>
    </hibernate-mapping>
    Voila, donc après cette entrée en matière un peu longue, voici mon problème.
    Dans mon main, j'ai mis en commentaire le code me permettant d'enregistrer une nouvelle adresse. J'ai bien mis une référence à 1 dans mon main, et pourtant, dans ma base de données, la colonne référence prend toujours la valeur 0...
    Dans la base, le champ n'est pas mis en auto_increment.
    C'est juste la primary key, donc not null, ...
    Je me demande si j'ai pas un problème de mapping et qu'il n'arrive pas à mapper ma colonne reference avec mon champ reference de mon objet ...

    Quelqu'un aurait une idée ?

    Merci d'avance

  2. #2
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    la colonne reference est de quel type dans a base de données?

    Aussi, tu as deux méthodes setReference, avec des signatures différentes, hibernate, que je sache n'apprécie pas trop quand il doit chercher les getters/setters

  3. #3
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2007
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2007
    Messages : 28
    Par défaut
    Mon champ Reference dans la base de données est de type integer.

    J'ai essayé d'enlever le setteur prenant un int en paramètre dans la classe ObjetProjet, mais malheureusement, ça ne change rien, j'ai toujours 0 dans la colonne reference.

    Je me disais qu'il devait y avoir un problème dans mon fichier de mapping : je dis juste que j'ai un objet de type Serializable en id, mais je ne précise pas que c'est un objet de type Reference...
    Comment la JVM peut savoir de quel type de serializable il doit mapper ?

  4. #4
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2007
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2007
    Messages : 28
    Par défaut
    Alors, je viens de réussir, mais je ne suis pas sur que l'art et la manière soit bien respecté ...
    Voici mon fichier de mapping Adresse.hbm.xml :
    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
    <?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
    <hibernate-mapping>
    	<class name="com.projet.domaine.Adresse" table="_Adresse">
    		<!--<id name="reference" type="java.io.Serializable" column="reference">
    			<generator class="assigned"/>
    		</id>-->
    		<composite-id name="reference" class="com.projet.domaine.Reference"> 
    			<key-property name="value" type="int"> 
    				<column name="reference" /> 
    			</key-property>
    		</composite-id>
    		<property name="numeroDeRue" type="string" not-null="false" />
    		<property name="rue" type="string" not-null="false" />
    		<property name="ville" type="string" not-null="false" />
    		<property name="codePostal" type="string" not-null="false" />
    		<property name="pays" type="string" not-null="false" />
    	</class>
    </hibernate-mapping>
    Je ne suis pas sur que l'utilisation de composite-id soit adaptée à la situation. Ce qui est sur, c'est que j'ai bien 1 en référence dans ma base de données au lieu de 0, mais au niveau des bonnes pratiques, je ne suis pas certain que je l'utilise de la bonne manière.
    Quelqu'un peut me donner un avis sur la question ?

    En plus de cela, je n'utilise plus de generator-class. Même si ce n'est pas le cas, comment aurais-je pu utiliser cette configuration en donnant un identifiant auto incrémenté par la base de données mais géré en java par ma classe Reference ?

    Je viens de voir ça sur le forum hibernate. Ça ne fait que confirmer un peu plus que l'utilisation de composite-id n'est pas vraiment la bonne solution ...
    https://forum.hibernate.org/viewtopic.php?f=1&t=973296

  5. #5
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Pourquoi créer un objet "Référence", alors que, manifestement, tu n'utilise qu'un int? Je veux dire, l'objet Reference, il correspond à quoi du point de vue DB? Si ça ne correspond à rien, il n'a rien à faire dans la BD. Je peux comprendre que ton code buisness derrière aie besoin pour une raison X ou y de mapper l'id dans un objet Reference, mais ça ne devrait pas concerner hibernate. Tu peux le faire comme ça, par exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public class Adresse{
     
     
     protected int getId(){
          return reference.getValue();
     }
     protected void setId(int id){
          reference = new Reference(id);
     }
     public Reference getReference(){
        return reference;
     }
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    	<class name="com.projet.domaine.Adresse" table="_Adresse">
    		<id name="id" type="int" column="reference">
    			<generator class="assigned"/>
    		</id>
    		<property name="numeroDeRue" type="string" not-null="false" />
    		<property name="rue" type="string" not-null="false" />
    		<property name="ville" type="string" not-null="false" />
    		<property name="codePostal" type="string" not-null="false" />
    		<property name="pays" type="string" not-null="false" />
    	</class>

  6. #6
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2007
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2007
    Messages : 28
    Par défaut
    Super !

    En effet, Reference n'a qu'un objectif technique mais qui ne concerne en aucun cas la base de données.

    J'ai donc mis en place ta solution, et ça donne de bons résultats.
    C'est encourageant :-)

    Sujet clos.

    Merci encore pour ton aide.

Discussions similaires

  1. Réponses: 4
    Dernier message: 14/06/2004, 09h29
  2. [connexion][CVS] Toujours mon probleme de connexion
    Par Gromitou dans le forum JBuilder
    Réponses: 11
    Dernier message: 07/11/2003, 18h41
  3. Réponses: 4
    Dernier message: 12/06/2003, 21h42
  4. [Kylix] Le son ! toujours le son :lol:
    Par JlouisI dans le forum EDI
    Réponses: 1
    Dernier message: 29/04/2003, 01h24
  5. Toujours un problème de rafraichissement de DBGrid
    Par tripper.dim dans le forum C++Builder
    Réponses: 4
    Dernier message: 09/12/2002, 13h15

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