bonjour

je veux créer un programme utilisant hibernate,spring, et JPA pour gérer la paie des employés d'une crèche (programme d' un tutorial de S. Tahé).
3 classes sont créées: employé, indemnité (des informations sur le calcul de la paie, munie d' une relation avec employé de type un à plusieurs: un enregistrement indemnité possède 0,1, ou plusieurs enregistrements employé), et cotisation (une table isolés sans relation).

mais :

voici les deux classes à l'origine du problème:

employé:

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
 
(...)
@Entity
@Table(name="employes")
public class employé implements Serializable{
 
    //doit être suivi par indemnité.Add(employé)
    public employé(String ss, String nom, String prénom, int code_postal,
            String adresse, String ville) {
        this.ss = ss;
        this.nom = nom;
        this.prénom = prénom;
        this.code_postal = code_postal;
        this.adresse = adresse;
        this.ville = ville;
    }
 
    public employé() {
    }
 
    @Id
    private String ss;
 
    //@SuppressWarnings(unused)
    @Version
    private int version;
 
    @Column(length=25,nullable=false)
    private String nom;
 
    @Column(name="prenom",length=25,nullable=false)
    private String prénom;
 
    @Column(nullable=false)
    private int code_postal;
 
    @Column(length=25,nullable=false)
    private String adresse;
 
    @Column(length=25,nullable=false)
    private String ville;
 
    @ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn(name="indemnites_indice")
    private indemnité indice;
 
(...)
et indemnité:

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
 
@Entity
@Table(name="indemnites")
public class indemnité implements Serializable{
 
    @Id
    @GeneratedValue(strategy =GenerationType.AUTO)
    private int indice;
 
    @Version
    private int version;
 
    @Column(nullable=false)
    private Double base_heure;
 
    @Column(nullable=false)
    private Double entretien_jour;
 
    @Column(nullable=false)
    private Double repas_jour;
 
    @Column(nullable=false)
    private Double indemnité_cp;
 
    @OneToMany(mappedBy="indice",cascade={CascadeType.ALL})
    private Set<employé> employés = new HashSet<employé>();
(...)
 
    public void Add (employé ze_employé){
        employés.add(ze_employé);
        ze_employé.setIndice(this);
 
    }
et voici l'erreur:


Hibernate:
select
cotisation0_.id as id12_,
cotisation0_.version as version12_,
cotisation0_.csgrds as csgrds12_,
cotisation0_.csgd as csgd12_,
cotisation0_.secu as secu12_,
cotisation0_.retraite as retraite12_
from
cotisation cotisation0_
Hibernate:
select
indemnité0_.indice as indice20_,
indemnité0_.version as version20_,
indemnité0_.base_heure as base3_20_,
indemnité0_.entretien_jour as entretien4_20_,
indemnité0_.repas_jour as repas5_20_,
indemnité0_.indemnité_cp as indemnité6_20_
from
indemnites indemnité0_
Hibernate:
select
employé0_.ss as ss25_,
employé0_.version as version25_,
employé0_.nom as nom25_,
employé0_.prenom as prenom25_,
employé0_.code_postal as code5_25_,
employé0_.adresse as adresse25_,
employé0_.ville as ville25_,
employé0_.indemnites_indice as indemnites8_25_
from
employes employé0_
Hibernate:
insert
into
indemnites
(version, base_heure, entretien_jour, repas_jour, indemnité_cp)
values
(?, ?, ?, ?, ?)
Hibernate:
insert
into
employes
(version, nom, prenom, code_postal, adresse, ville, indemnites_indice, ss)
values
(?, ?, ?, ?, ?, ?, ?, ?)
Hibernate:
select
indemnité0_.indice as indice38_,
indemnité0_.version as version38_,
indemnité0_.base_heure as base3_38_,
indemnité0_.entretien_jour as entretien4_38_,
indemnité0_.repas_jour as repas5_38_,
indemnité0_.indemnité_cp as indemnité6_38_
from
indemnites indemnité0_
where
indemnité0_.indice=?
Hibernate:
insert
into
indemnites
(version, base_heure, entretien_jour, repas_jour, indemnité_cp)
values
(?, ?, ?, ?, ?)
Hibernate:
insert
into
employes
(version, nom, prenom, code_postal, adresse, ville, indemnites_indice, ss)
values
(?, ?, ?, ?, ?, ?, ?, ?)
Hibernate:
select
indemnité0_.indice as indice44_,
indemnité0_.version as version44_,
indemnité0_.base_heure as base3_44_,
indemnité0_.entretien_jour as entretien4_44_,
indemnité0_.repas_jour as repas5_44_,
indemnité0_.indemnité_cp as indemnité6_44_
from
indemnites indemnité0_
where
indemnité0_.indice=?
Hibernate:
insert
into
employes
(version, nom, prenom, code_postal, adresse, ville, indemnites_indice, ss)
values
(?, ?, ?, ?, ?, ?, ?, ?)
javax.persistence.RollbackException: Error while commiting the transaction
FAILED: initDB
intro_j2ee.exception.PamException: Erreur dans dao/employé_dao/create - opération persist
at intro_j2ee.dao.employé_dao.create(employé_dao.java:45)
at dao.InitDB.initDB(InitDB.java:64)
le fichier en question, initDB est le fichier de tests:

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
 
public class InitDB {
 
    //@PersistenceContext
    //private EntityManager em;
    private IEmployéDao employeDao = null;
    private ICotisationDao cotisationDao = null;
    private IIndemnitéDao indemniteDao = null;
 
    @BeforeClass
    public void init() {
        // configuration de l'application
        ApplicationContext ctx = new ClassPathXmlApplicationContext("spring-config-dao.xml");
        // couches dao
        employeDao = (IEmployéDao) ctx.getBean("employéDao");
        cotisationDao = (ICotisationDao) ctx.getBean("cotisationDao");
        indemniteDao = (IIndemnitéDao) ctx.getBean("indemnitéDao");
    }
 
    @Test
    public void initDB() {
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("intro_J2EEPU");
        EntityManager em = emf.createEntityManager();
        // on remplit la base
        indemnité une_ind = new indemnité(0, 0, 2.38, 1.03, 15.0, 5.0);
        indemnité deux_ind = new indemnité(0, 0, 1.43, 2.0, 10.0, 7.0);
 
 
        employé un_employé = new employé("174075746304472", "TRICHE", "Olivier", 57050, "4 rue de Gorze", "metz");
        employé deux_employé=new employé ("075075721252403", "ROY", "Betty", 57412, "3 rue des roses", "Clouange");
 
        une_ind.Add(un_employé);
        deux_ind.Add(deux_employé);
 
        indemniteDao.create(une_ind);
        indemniteDao.create(deux_ind);
 
        employeDao.create(un_employé);
        employeDao.create(deux_employé);
 
        cotisation une_cot = new cotisation(1.3, 2.7, 2.1, 1.0);
        cotisationDao.create(une_cot);
 
 
        // on affiche le contenu de la base
        System.out.println("*** AFFICHAGE DU CONTENU DE JPA2 ***");
        System.out.println("*** TABLE indemnité              ***");
        for (Object ind : em.createQuery("select i from indemnité i").getResultList()) {
            System.out.println(ind);
        }
        System.out.println("*** TABLE cotisation              ***");
        for (Object cot : em.createQuery("select c from cotisation c").getResultList()) {
            System.out.println(cot);
        }
        System.out.println("*** TABLE employé              ***");
        for (Object emp : em.createQuery("select e from employé e").getResultList()) {
            System.out.println(emp);
        }
    }
enfin, voici les fichiers persistence.xml:

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"?>
<persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >
 
  <persistence-unit name="intro_J2EEPU" transaction-type="RESOURCE_LOCAL">
 <!-- provider -->
<provider>org.hibernate.ejb.HibernatePersistence</provider>
 <class>intro_j2ee.jpa.cotisation</class>
    <class>intro_j2ee.jpa.employé</class>
    <class>intro_j2ee.jpa.indemnité</class>
 
 
 <properties>
 <!-- Classes persistantes -->
 <property name="hibernate.archive.autodetection" value="class, hbm"/>
 
 <property name="hibernate.show_sql" value="true"/>
 <property name="hibernate.format_sql" value="true"/>
 <property name="use_sql_comments" value="true"/>
 
 <!-- connexion JDBC -->
 <property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"/>
 <property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/jpa2"/>
 <property name="hibernate.connection.username" value="jpa2"/>
 <property name="hibernate.connection.password" value="jpa2"/>
 <!-- création automatique du schéma -->
 <property name="hibernate.hbm2ddl.auto" value="create-drop"/>
 <!-- Dialecte -->
 <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5InnoDBDialect"/>
 <!-- propriétés DataSource c3p0 -->
 <property name="hibernate.c3p0.min_size" value="5"/>
 <property name="hibernate.c3p0.max_size" value="20"/>
 <property name="hibernate.c3p0.timeout" value="300"/>
 <property name="hibernate.c3p0.max_statements" value="50"/>
 <property name="hibernate.c3p0.idle_test_period" value="3000"/>
 </properties>
 </persistence-unit>
</persistence>

et spring-config-dao.xml:

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
 
<?xml version="1.0" encoding="UTF-8"?>
 <beans xmlns="http://www.springframework.org/schema/beans"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xmlns:tx="http://www.springframework.org/schema/tx"
 xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
 
 <!-- couches applicatives 
 <bean id="dao" class="dao.Dao" />
 <bean id="service" class="service.Service">
    <property name="dao" ref="dao" />
 </bean>-->
 
 <bean id="employéDao" class="intro_j2ee.dao.employé_dao" />
 <bean id="cotisationDao" class="intro_j2ee.dao.cotisation_dao" />
 <bean id="indemnitéDao" class="intro_j2ee.dao.indemnité_dao" />
 
 
 
 <!-- couche de persistance JPA -->
 <bean id="entityManagerFactory"
 class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
 <property name="dataSource" ref="dataSource" />
 <property name="jpaVendorAdapter">
 <bean
 class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
 <!--
 <property name="showSql" value="true" />
 -->
 <property name="databasePlatform"
 value="org.hibernate.dialect.MySQL5InnoDBDialect" />
 <property name="generateDdl" value="true" />
 </bean>
 </property>
 <property name="loadTimeWeaver">
 <bean
 class="org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver" />
 </property>
 </bean>
 
 <!-- la source de donnéees DBCP -->
 <bean id="dataSource"
 class="org.apache.commons.dbcp.BasicDataSource"
 destroy-method="close">
 <property name="driverClassName" value="com.mysql.jdbc.Driver" />
 <property name="url" value="jdbc:mysql://localhost:3306/jpa2" />
 <property name="username" value="jpa2" />
 <property name="password" value="jpa2" />
 </bean>
 
 <!-- le gestionnaire de transactions -->
 <tx:annotation-driven transaction-manager="txManager" />
 <bean id="txManager"
 class="org.springframework.orm.jpa.JpaTransactionManager">
 <property name="entityManagerFactory"
 ref="entityManagerFactory" />
 </bean>
 
 <!-- traduction des exceptions -->
 <bean
 class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor" />
 
 <!-- annotations de persistance -->
 <bean
 class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />
 
 </beans>
(j'utilise testng et non junit pour les tests)
il y a un problème au moment de persister un employé mais je ne peux pas en dire plus.

savez-vous comment je pourrais avoir le contenu des paramètres dans les requêtes hibernate? et la base ast vide après l'exécution de initDB.

lolveley.