IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Hibernate Java Discussion :

[netbeans,vista] javax.persistence.RollbackException: Error while commiting the trans


Sujet :

Hibernate Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2006
    Messages
    958
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2006
    Messages : 958
    Par défaut [netbeans,vista] javax.persistence.RollbackException: Error while commiting the trans
    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.

  2. #2
    Membre expérimenté Avatar de aperrin
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    221
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 221
    Par défaut
    Pour hibernate tu a le paramètre show_sql=true pour voir les requetes sql.
    Sinon utilise ps6spy pour voir passer les requêtes

  3. #3
    Membre éprouvé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2006
    Messages
    958
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2006
    Messages : 958
    Par défaut
    merci, j'utilisais déjà le paramètre mais je n'ai pas les variables de la requête (qui utilise des "?").
    je vais jeter un coup d'oeil sur p6spy.

    lolveley.

  4. #4
    Membre éprouvé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2006
    Messages
    958
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2006
    Messages : 958
    Par défaut
    il s'est passé pas mal de choses, et j'ai résolu le problème, mais partiellement seulement.
    déjà je crois que les lignes employeDao.create (...) sont inutiles car indemnité possède une référence sur cette classe qui est persistée en cascade.
    maintenant, j'ai un problème car lorsque je fais l'opération de persistance, les classes sont bien sauvegardées dans la base (c'est p6spy et mySQL administrator qui me le disent) mais elles sont supprimées (avec un drop table) et ça se passe lors de l'instanciation de l'entityManagerFactory et de l'entityManager!!!

    je ne sais par pourquoi, j'ai modifié l'option "<property name="hibernate.hbm2ddl.auto" value="create-drop"/>
    " en "create" mais ça n'a servi à rien.

    voici un extrait pertinent du programme:

    employeDao.java
    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
     
     @Override
        public employé create(employé ze_employé) {
            EntityManagerFactory emf = Persistence.createEntityManagerFactory("intro_J2EEPU");
            EntityManager em = emf.createEntityManager();
     
            List<employé> liste;
            employé emp2 = ze_employé;
            try {
                em.getTransaction().begin();
                em.persist(ze_employé);
                em.getTransaction().commit();
     
     
            } catch (EntityExistsException e) {
                throw new PamException("Erreur dans dao/employé_dao/create - opération persist", 1);
     
            } catch (Exception e) {
                System.out.println(e.toString());
                throw new PamException("Erreur dans dao/employé_dao/create - opération persist", 2);
     
            }
     
            try {
                Query query = em.createQuery("select e from employé e where e.ss=:ss");
                query.setParameter("ss", emp2.getSs());
                liste = query.getResultList();
            } catch (Exception e) {
                System.out.println(e.toString());
                throw new PamException("Erreur dans dao/employé_dao/create - opération query", 2);
            }
            em.close();
            return liste.get(0);
     
     
        }
    la suppresion de la base se fait dans les deux premières lignes de la table.


    spy.log
    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
     
    (...)
    1228194153336|3|16|statement|insert into employes (version, nom, prenom, code_postal, adresse, ville, indemnites_indice, ss) values (?, ?, ?, ?, ?, ?, ?, ?)|insert into employes (version, nom, prenom, code_postal, adresse, ville, indemnites_indice, ss) values (0, 'TRICHE', 'Olivier', 57050, '8 impasse des tilleuls', 'metz', 1, '174075751212322')
     
    1228194153366|28|16|commit||
     
    1228194153388|2|17|statement|select indemnit�0_.indice as indice18_, indemnit�0_.version as version18_, indemnit�0_.base_heure as base3_18_, indemnit�0_.entretien_jour as entretien4_18_, indemnit�0_.repas_jour as repas5_18_, indemnit�0_.indemnit�_cp as indemnit�6_18_ from indemnites indemnit�0_ where indemnit�0_.indice=?|select indemnit�0_.indice as indice18_, indemnit�0_.version as version18_, indemnit�0_.base_heure as base3_18_, indemnit�0_.entretien_jour as entretien4_18_, indemnit�0_.repas_jour as repas5_18_, indemnit�0_.indemnit�_cp as indemnit�6_18_ from indemnites indemnit�0_ where indemnit�0_.indice=1
     
    1228194153392|-1||resultset|select indemnit�0_.indice as indice18_, indemnit�0_.version as version18_, indemnit�0_.base_heure as base3_18_, indemnit�0_.entretien_jour as entretien4_18_, indemnit�0_.repas_jour as repas5_18_, indemnit�0_.indemnit�_cp as indemnit�6_18_ from indemnites indemnit�0_ where indemnit�0_.indice=1|indice18_ = 1
     
    1228194153830|188|20|statement||alter table employes drop foreign key FK4722E6BC5882251C
     
    1228194153894|63|20|statement||drop table if exists cotisations
     
    1228194153929|35|20|statement||drop table if exists employes
     
    1228194153948|18|20|statement||drop table if exists indemnites
    (...)
    dans le premier bloc on voit l'insert (Olivier TRICHE) et dans les suivants on voit des drop table if exists...

    lolveley.

Discussions similaires

  1. Réponses: 0
    Dernier message: 04/03/2015, 16h46
  2. Réponses: 5
    Dernier message: 01/12/2008, 01h14
  3. [NetBeans]Librairy javax.microedition manquante
    Par Arkan dans le forum NetBeans
    Réponses: 1
    Dernier message: 24/02/2005, 16h47
  4. Réponses: 3
    Dernier message: 10/12/2004, 09h42
  5. Réponses: 2
    Dernier message: 05/02/2004, 13h58

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo