bonjour,
voilà dans ma croisade vers une meilleur compréhension d'hibernate 3 et de ses subtilités je teste les différents types de relations et là je ne comprend plus rien du tout sur la relation many-to-one, tous semble apparemment bien configuré et pourtant lors des selects l'objet père n'est pas chargé
mon environnement:
jre 1.6
hibernate 3
hsqldb 1.8 en mode fichier
mes tables et les données:
mes fichiers 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 CREATE TABLE COMPTE ( ID_COMPTE integer GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, ID_UTI integer, NOM_COMPTE varchar(255), NOM_BANQUE varchar(255), SOLDE_INITIAL double) ALTER TABLE COMPTE ADD CONSTRAINT UTI_COMPTE FOREIGN KEY (ID_UTI) REFERENCES UTILISATEUR (ID_UTI) CREATE TABLE UTILISATEUR ( ID_UTI integer GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, NOM_UTI varchar(255), PRENOM_UTI varchar(255)) INSERT INTO COMPTE VALUES(1,1,'nom compte 1','nom Banque 1',0.36251522800319114E0) INSERT INTO COMPTE VALUES(2,1,'nom compte 2','nom Banque 2',0.5464440788761791E0) INSERT INTO UTILISATEUR VALUES(1,'nom','prenom')
mes classes:
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 <?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 package="appli"> <class name="Compte" table="COMPTE"> <!-- Identifiant --> <id name="idCompte" column="ID_COMPTE" type="int"> <generator class="increment"/> </id> <property name="nomCompte" column="NOM_COMPTE" type="string"/> <property name="nomBanque" column="NOM_BANQUE" type="string"/> <property name="soldeInitial" column="SOLDE_INITIAL" type="double"/> <!-- Relation One To One to Utilisateur --> <many-to-one column="ID_UTI" name="utilisateur" class="Utilisateur"/> </class> </hibernate-mapping> <?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 package="appli"> <class name="Utilisateur" table="UTILISATEUR"> <id name="idUtilisateur" column="ID_UTI" type="int"> <generator class="increment"/> </id> <property name="nomUtilisateur" column="NOM_UTI" type="string"/> <property name="prenomUtilisateur" column="PRENOM_UTI" type="string"/> <!-- Relation One to Many to COMPTE --> <bag name="comptes" cascade="persist,save-update" inverse="false"> <key column="ID_UTI"/> <one-to-many class="Compte"/> </bag> </class> </hibernate-mapping>
et enfin (ouf) mon main de test
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 public class Compte { private int idCompte; private String nomCompte; private String nomBanque; private double soldeInitial; private Utilisateur utilisateur; ------} public class Utilisateur { private int idUtilisateur; private String nomUtilisateur; private String prenomUtilisateur; private List<Compte> comptes; -----}
avec cette configuration la liste des comptes est bien initialisée mais pas l'objet utilisateur dans l'objet compte.
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 public class Test { public static Session session; /** * @param args */ public static void main(String[] args) { initialiseSession(); traitementHibernateSelect(); terminateSession(); } private static void terminateSession() { System.out.println("-- begin terminate session --"); session.close(); session.getSessionFactory().close(); System.out.println("-- end terminate session --"); } private static void initialiseSession() { System.out.println("-- begin init session --"); Configuration configuration = new Configuration() .addResource("appli/Compte.hbm.xml") .addResource("appli/Utilisateur.hbm.xml") .setProperty("hibernate.dialect", "org.hibernate.dialect.HSQLDialect") .setProperty("hibernate.connection.driver_class", "org.hsqldb.jdbcDriver") .setProperty("hibernate.connection.url", "jdbc:hsqldb:file:G:\\java\\tests\\testDB2\\MyDB2.userDB2;shutdown=true") .setProperty("hibernate.connection.username", "sa") .setProperty("hibernate.connection.password", "") .setProperty("hibernate.connection.pool_size", "1") .setProperty("hibernate.show_sql", "true") .setProperty("hibernate.hbm2ddl.auto", "validate"); SessionFactory sessionFactory = configuration.buildSessionFactory(); session = sessionFactory.openSession(); System.out.println("-- end init Session --"); } private static void traitementHibernateSelect() { System.out.println("-- begin select tables --"); if(!session.isOpen()){ session = session.getSessionFactory().openSession(); } session.beginTransaction(); List<Utilisateur> utilisateurs = session.createQuery("from Utilisateur").list(); System.out.println("nb utilisateurs: " + utilisateurs.size()); Iterator<Utilisateur>iUtilisateurs = utilisateurs.iterator(); while(iUtilisateurs.hasNext()){ System.out.println("-----------------------"); Utilisateur uti = iUtilisateurs.next(); System.out.println(uti); Iterator<Compte>iComptes = uti.getComptes().iterator(); while(iComptes.hasNext()){ Compte compte = iComptes.next(); System.out.println(compte); } } session.close(); System.out.println("-- end Select tables --"); } }
pourtant ce cas est on ne peut plus académique et cela devrait marcher...
si quelqu'un à une idée merci d'avance
Edit : un select sur la table compte donne le même résulta et dans se cas en regardant les logs hibernate il n'y a pas du tout de requete sur le champ ID_UTI
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 23:00:56,660 DEBUG QueryTranslatorImpl:177 - HQL: from appli.Compte 23:00:56,663 DEBUG QueryTranslatorImpl:178 - SQL: select compte0_.ID_COMPTE as ID1_, compte0_.NOM_COMPTE as NOM2_0_, compte0_.NOM_BANQUE as NOM3_0_, compte0_.SOLDE_INITIAL as SOLDE4_0_ from COMPTE compte0_ 23:00:56,669 DEBUG AbstractBatcher:258 - about to open PreparedStatement (open PreparedStatements: 0, globally: 0) 23:00:56,671 DEBUG SQL:292 - select compte0_.ID_COMPTE as ID1_, compte0_.NOM_COMPTE as NOM2_0_, compte0_.NOM_BANQUE as NOM3_0_, compte0_.SOLDE_INITIAL as SOLDE4_0_ from COMPTE compte0_ Hibernate: select compte0_.ID_COMPTE as ID1_, compte0_.NOM_COMPTE as NOM2_0_, compte0_.NOM_BANQUE as NOM3_0_, compte0_.SOLDE_INITIAL as SOLDE4_0_ from COMPTE compte0_ 23:00:56,673 DEBUG AbstractBatcher:343 - preparing statement 23:00:56,702 DEBUG AbstractBatcher:274 - about to open ResultSet (open ResultSets: 0, globally: 0) 23:00:56,705 DEBUG Loader:377 - processing result set 23:00:56,706 DEBUG Loader:382 - result set row: 0 23:00:56,710 DEBUG IntegerType:86 - returning '1' as column: ID1_ 23:00:56,715 DEBUG Loader:719 - result row: EntityKey[appli.Compte#1] 23:00:56,717 DEBUG Loader:864 - Initializing object from ResultSet: [appli.Compte#1] 23:00:56,725 DEBUG BasicEntityPersister:1625 - Hydrating entity: [appli.Compte#1] 23:00:56,727 DEBUG StringType:86 - returning 'nom compte 1' as column: NOM2_0_ 23:00:56,729 DEBUG StringType:86 - returning 'nom Banque 1' as column: NOM3_0_ 23:00:56,731 DEBUG DoubleType:86 - returning '0.36251522800319114' as column: SOLDE4_0_ 23:00:56,734 DEBUG Loader:382 - result set row: 1 23:00:56,735 DEBUG IntegerType:86 - returning '2' as column: ID1_ 23:00:56,737 DEBUG Loader:719 - result row: EntityKey[appli.Compte#2] 23:00:56,740 DEBUG Loader:864 - Initializing object from ResultSet: [appli.Compte#2] 23:00:56,741 DEBUG BasicEntityPersister:1625 - Hydrating entity: [appli.Compte#2] 23:00:56,743 DEBUG StringType:86 - returning 'nom compte 2' as column: NOM2_0_ 23:00:56,745 DEBUG StringType:86 - returning 'nom Banque 2' as column: NOM3_0_ 23:00:56,747 DEBUG DoubleType:86 - returning '0.5464440788761791' as column: SOLDE4_0_ 23:00:56,749 DEBUG Loader:399 - done processing result set (2 rows)
Partager