Salut à tous et toutes,
j'aimerais un coup de main en ce qui concerne le mapping! Entre le tuto de developpez, le plugin HibernateSynchronizer et la doc d'hibernate:
je suis perdu!
Voilà un exemple simple de mon application dans lequel je m'embrouille:
Dans ma base de données, j'ai:
- une table learner(idLearner, ...) = mes étudiants
- une table mission(idMission,...) = mes TP
- une table de jointure linkMissionLearn(idMissionLearn, idLearner, idMission) = quels étudiants font quels TP (un étudiant participe à plusieurs TP, et un TP a bien entendu plusieurs étudiants!). Au passage, est-il nécessaire pour être gérée par Hibernate que cette table de jointure ait son propre identifiant?...
Et voilà mon gros problème, je n'arrive pas à mapper cette relation many-to-many correctement! Selon la doc Hibernate, il faut rajouter dans chaque classe de mapping Learner et Mission l'équivalent d'un Set, ce que j'ai fait de la sorte:
mapping Mission (en gras l'ajout pour gérer la relation):
mapping de Learner:
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 <?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN" "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd" > <hibernate-mapping package="hibernate"> <class name="Mission" table="mission"> <id column="idMission" name="IdMission" type="integer" > <generator class="increment" /> </id> <property column="lastModification" name="LastModification" not-null="true" type="timestamp" /> <property column="name" length="80" name="Name" not-null="true" type="string" /> <property column="fileXML" name="FileXML" not-null="true" type="string" /> <set name="LinkmissionlearnSet" table="linkMissionLearn"> <key column="idMission"/> <many-to-many column="idLearner" class="Learner"/> </set> </class> </hibernate-mapping>
Voilà le fichier de config d'hibernate:
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//EN" "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd" > <hibernate-mapping> <class name="hibernate.Learner" table="learner"> <id name="IdLearner" type="integer" length="10"> <column name="idLearner" not-null="true"/> <generator class="increment"/> </id> <set name="LinkmissionlearnSet" table="linkMissionLearn"> <key column="idLearner"/> <many-to-many column="idMission" class="Mission"/> </set> </class> </hibernate-mapping>
Avec ces deux ajouts, j'obtiens une erreur de ce genre :
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 <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD//EN" "http://hibernate.sourceforge.net/hibernate-configuration-2.0.dtd"> <hibernate-configuration> <session-factory> <!-- local connection properties --> <property name="hibernate.connection.url"> jdbc:mysql://127.0.0.1:3306/base </property> <property name="hibernate.connection.driver_class"> com.mysql.jdbc.Driver </property> <property name="hibernate.connection.username">user</property> <property name="hibernate.connection.password">user</property> <!-- property name="hibernate.connection.pool_size"></property --> <!-- dialect for MySQL --> <property name="dialect"> org.hibernate.dialect.MySQLDialect </property> <property name="hibernate.show_sql">true</property> <property name="hibernate.use_outer_join">true</property> <!-- <property name="hibernate.transaction.factory_class"> net.sf.hibernate.transaction.JTATransactionFactory </property> <property name="jta.UserTransaction"> java:comp/UserTransaction </property>--> <property name="hibernate.transaction.factory_class"> org.hibernate.transaction.JDBCTransactionFactory </property> <mapping resource="Mission.hbm" /> <mapping resource="Learner.hbm" /> </session-factory> </hibernate-configuration>
ou encore, après quelques corrections:
Code : Sélectionner tout - Visualiser dans une fenêtre à part Initial SessionFactory creation failed.org.hibernate.MappingException: An association from the table linkMissionLearn refers to an unmapped class: Mission
Je me dis que la classe Mapping est pourtant bien mappée... Peut-être faut-il que je mappe également la table de jointure?...
Code : Sélectionner tout - Visualiser dans une fenêtre à part Initial SessionFactory creation failed.org.hibernate.MappingException: Association references unmapped class: hibernate.Linkmissionlearn
Ensuite, j'ai lu dans plusieurs post du forum qu'il valait mieux un fichier de mapping par table, ce qui me paraît sensé et plus "naturel", du coup j'ai aussi fait un fichier de mapping pour la table de jointure (auquel je n'ai pas touché, entièrement généré par le plugin d'Eclipse):
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 <?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN" "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd" > <hibernate-mapping package="hibernate"> <class name="Linkmissionlearn" table="linkmissionlearn"> <id column="idLinkMissionLearn" name="IdLinkMissionLearn" type="integer" > <generator class="vm" /> </id> <many-to-one class="Learner" name="IdLearn" not-null="true" > <column name="idLearn" /> </many-to-one> <many-to-one class="Mission" name="IdMission" not-null="true" > <column name="idMission" /> </many-to-one> </class> </hibernate-mapping>
Mais je me demande si cela ne génère pas de conflit avec les fichiers de mapping de Mission et Learner dans lesquels j'ai rajouté le code?
Enfin, n'en faisons pas un roman (c'est déjà fait apparemment, oups!) Mais comme vouos pouvez le voir, je ne comprends pas grand chose au mapping des relations (pourtant je suis sûr que ce n'est pas si compliqué!).
Si quelqu'un pouvait m'expliquer clairement la démarche à suivre pour mapper cette relation... Ca m'aiderait grandement, merci d'avance!
Partager