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 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 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 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 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); } }
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 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; } }
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
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 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 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; } }
Et enfin mes deux fichiers de configurations :
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(); } }
D'abord hibernate.cfg.xml :
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 <?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>
Voila, donc après cette entrée en matière un peu longue, voici mon problème.
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>
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![]()
Partager