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 :aie::
voici les deux classes à l'origine du problème:
employé:
et indemnité:Code:
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 voici l'erreur:Code:
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); }
le fichier en question, initDB est le fichier de tests:Citation:
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)
enfin, voici les fichiers persistence.xml:Code:
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); } }
Code:
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:
(j'utilise testng et non junit pour les tests)Code:
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>
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.