Bonjour,
Voilà, Hibernate me pose encore et toujours des soucis, en effet je n'arrive pas a mapper une relation one-to-many
Contexte un utilisateur possède une collection (un set) de fichiers
la table utilisateur :
la table fichier :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 CREATE TABLE utilisateur ( id int2 NOT NULL, nom varchar(20) NOT NULL, CONSTRAINT "User_pkey" PRIMARY KEY (id) ) WITHOUT OIDS; ALTER TABLE utilisateur OWNER TO postgres;
le mapping user :
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 CREATE TABLE fichiers ( id int2 NOT NULL, nom varchar(50), id_utilisateur int2, CONSTRAINT fichiers_pkey PRIMARY KEY (id), CONSTRAINT fichiers_id_utilisateur_fkey FOREIGN KEY (id_utilisateur) REFERENCES utilisateur (id) MATCH SIMPLE ON UPDATE NO ACTION ON DELETE NO ACTION ) WITHOUT OIDS; ALTER TABLE fichiers OWNER TO postgres; GRANT ALL ON TABLE fichiers TO postgres; GRANT ALL ON TABLE fichiers TO public;
le 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
16
17
18
19 <hibernate-mapping> <class name="metier.User" table="utilisateur"> <id name="id" type="integer"> <column name="id"/> <generator class="sequence" /> </id> <property name="nom" type="string"> </property> <set name="fichiers" cascade="all" lazy="true"> <key column="id_utilisateur"></key> <one-to-many class="metier.Fichier"></one-to-many> </set> </class> </hibernate-mapping
Et un extrait de l'erreur généré :
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 Session session = HibernateUtil.currentSession(); Transaction tx = session.beginTransaction(); User us = new User(); us.setNom("Robert"); Fichier fic1 = new Fichier(); fic1.setNom("test.doc"); Fichier fic2 = new Fichier(); fic2.setNom("ouille.jpg"); us.getFichiers().add(fic1); us.getFichiers().add(fic2); session.save(us); tx.commit(); System.out.println("Enregistrement effectué"); System.out.println("Recuperation des données"); List listUser = session.createQuery("from utilisateur").list(); Iterator it = listUser.iterator(); while(it.hasNext()) { User util = (User)it.next(); System.out.println("L'utilisateur"+util.getNom()+"possède les fichiers suivants :"); for(Fichier f : util.getFichiers()) { System.out.println(f.getNom()); } } HibernateUtil.closeSession(); }
Pourquoi prend-il 0 comme id utilisateur ? bizarreHibernate: select nextval ('hibernate_sequence')
Hibernate: select nextval ('hibernate_sequence')
Hibernate: select nextval ('hibernate_sequence')
Hibernate: insert into utilisateur (nom, id) values (?, ?)
Hibernate: insert into fichiers (nom, id_utilisateur, id) values (?, ?, ?)
Hibernate: insert into fichiers (nom, id_utilisateur, id) values (?, ?, ?)
15:00:16,409 WARN JDBCExceptionReporter:71 - SQL Error: 0, SQLState: null
15:00:16,409 ERROR JDBCExceptionReporter:72 - L'élément du batch 0 insert into fichiers (nom, id_utilisateur, id) values (test.doc, 0, 54) a été annulé. Appeler getNextException pour en connaître la cause.
15:00:16,409 WARN JDBCExceptionReporter:71 - SQL Error: 0, SQLState: 23503
15:00:16,409 ERROR JDBCExceptionReporter:72 - ERROR: insert or update on table "fichiers" violates foreign key constraint "fichiers_id_utilisateur_fkey"
Détail : Key (id_utilisateur)=(0) is not present in table "utilisateur".
15:00:16,419 ERROR AbstractFlushingEventListener:300 - Could not synchronize database state with session
org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update
Voila toujours avec mes déboires face a Hibernate mais je suis têtu, j'y arriverai ...
PS : si j'enlève la contrainte foreign key sur la colonne id_utilisateur de la table fichiers alors l'insertion marche. Mais la récupération foire sur :
avec l'erreur suivante :
Code : Sélectionner tout - Visualiser dans une fenêtre à part List listUser = session.createQuery("from utilisateur").list();
Quelqu'un saurait-il m'expliquer comment résoudre ce problème ?Exception in thread "main" java.lang.NoClassDefFoundError: antlr/ANTLRException
at org.hibernate.hql.ast.ASTQueryTranslatorFactory.createQueryTranslator(ASTQueryTranslatorFactory.java:35)
at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:72)
at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:54)
at org.hibernate.engine.query.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:71)
at org.hibernate.impl.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:133)
at org.hibernate.impl.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:112)
at org.hibernate.impl.SessionImpl.createQuery(SessionImpl.java:1583)
at test.Test.main(Test.java:44)
Merci d'avance pour votre aide.
Partager