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 :
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;
la table fichier :
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 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
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
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
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();
    }
Et un extrait de l'erreur généré :
Hibernate: 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
Pourquoi prend-il 0 comme id utilisateur ? bizarre

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 :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
List listUser = session.createQuery("from utilisateur").list();
avec l'erreur suivante :
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)
Quelqu'un saurait-il m'expliquer comment résoudre ce problème ?

Merci d'avance pour votre aide.