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 :

Constraint violation sur Persist / via Hibernate / H2 embedded


Sujet :

Hibernate Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juillet 2012
    Messages
    106
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2012
    Messages : 106
    Par défaut Constraint violation sur Persist / via Hibernate / H2 embedded
    Bonjour,

    j'ai un petit souci sur l'insertion d'une entity via Hibernate dans ma base.

    j'ai ce joli message de ma base
    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
    javax.persistence.PersistenceException: org.hibernate.exception.ConstraintViolationException: could not execute statement
    	at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1387)
    	at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1310)
    	at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1316)
    	at org.hibernate.ejb.AbstractEntityManagerImpl.persist(AbstractEntityManagerImpl.java:881)
    	at com.cwfse.DAO.Implementation.JPAStatiqValuesDao.persistEntity(JPAStatiqValuesDao.java:62)
    	at com.cwfse.traitements.ObjectsToXml.CCAMAction(ObjectsToXml.java:990)
    	at com.cwfse.websocket.WsocketHandler$WSocket.onMessage(WsocketHandler.java:162)
    	at org.eclipse.jetty.websocket.WebSocketConnectionRFC6455$WSFrameHandler.onFrame(WebSocketConnectionRFC6455.java:845)
    	at org.eclipse.jetty.websocket.WebSocketParserRFC6455.parseNext(WebSocketParserRFC6455.java:359)
    	at org.eclipse.jetty.websocket.WebSocketConnectionRFC6455.handle(WebSocketConnectionRFC6455.java:235)
    	at org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:609)
    	at org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:45)
    	at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:599)
    	at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:534)
    	at java.lang.Thread.run(Unknown Source)
    dans mon persistence.xml, je subodore que cette propriété, me perturbe mon enregistrement

    <property name="hibernate.hbm2ddl.auto" value="update"/>

    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
    <?xml version="1.0" encoding="UTF-8"?>
    <persistence xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
      version="2.0" xmlns="http://java.sun.com/xml/ns/persistence">
      <persistence-unit name="CWFSE" transaction-type="RESOURCE_LOCAL">
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
        <class>com.cwfse.DAO.entities.MessagesErreur</class>
        <class>com.cwfse.DAO.entities.DocXslEntity</class>
        <class>com.cwfse.DAO.entities.RadiosPropEntity</class>
        <class>com.cwfse.DAO.entities.PratConfigEntity</class>
        <class>com.cwfse.DAO.entities.ReferEntity</class>
        <class>com.cwfse.DAO.entities.EtatFseEntity</class>
        <class>com.cwfse.DAO.entities.StatiqValues</class>
        <properties>
             <property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/>
          <property name="javax.persistence.jdbc.driver" value="org.h2.Driver"/>
          <property name="javax.persistence.jdbc.url" value="jdbc:h2:file:bdd/cwfse_p;"/>
          <property name="javax.persistence.jdbc.user" value="sa"/>
          <property name="javax.persistence.jdbc.password" value=""/>
           <property name="cache.provider_class" value="org.hibernate.cache.internal.NoCacheProvider"/>
          <property name="hibernate.hbm2ddl.auto" value="update"/>
          <property name="hibernate.connection.useUnicode" value="true"/>
    		<property name="hibernate.connection.characterEncoding" value="Cp1252" />
    		<property name="hibernate.connection.charSet" value="Cp1252"/>
        </properties>
      </persistence-unit>
      <persistence-unit name="Session_App" transaction-type="RESOURCE_LOCAL">
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
        <class>com.cwfse.DAO.entities.BeneficiaireEntity</class>
        <class>com.cwfse.DAO.entities.PatientEntity</class>
        <class>com.cwfse.DAO.entities.PraticienEntity</class>
        <class>com.cwfse.DAO.entities.PSEntity</class>
        <properties>
          <property name="javax.persistence.jdbc.driver" value="org.h2.Driver"/>
          <property name="javax.persistence.jdbc.url" value="jdbc:h2:mem:cwfsedb"/>
          <property name="javax.persistence.jdbc.user" value="sa"/>
          <property name="javax.persistence.jdbc.password" value=""/>
          <property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/>
          <property name="hibernate.hbm2ddl.auto" value="create-drop"/>
           <property name="cache.provider_class" value="org.hibernate.cache.internal.NoCacheProvider"/>
        </properties>
      </persistence-unit>
    </persistence>
    L'entity en cause

    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
    @Entity
    @NamedQueries({ 
        @NamedQuery(name = "StatiqValue.findAll", query = "SELECT e FROM StatiqValues e "),
        @NamedQuery(name = "StatiqValue.findByID", query = "SELECT e FROM StatiqValues e WHERE e.id = :id "),
        @NamedQuery(name = "StatiqValue.findByConstante", query = "SELECT e FROM StatiqValues e WHERE e.constante = :constante ")
    })
    @Table(name = "StatiqValue")
    public class StatiqValues implements Serializable {
     
     
        private static final long serialVersionUID = 1L;
     
        @Id
        @GeneratedValue(strategy = GenerationType.AUTO)
        @Column(name = "ID_STVAL")
        private Long id;
        private String constante;
        private String valeur;
        private String commentaire;
    si j'utilise un create, mes bases initialisées ne sont pas accessibles, et create-drop, comme son nom l'indique, ne sert que pendant la session.

    Quelqu'un aurait une idée du mode a utiliser / configurer ?

  2. #2
    Membre éclairé
    Avatar de omar344
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juin 2007
    Messages
    287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2007
    Messages : 287
    Par défaut
    Bonsoir!
    Peux-tu montrer le code qui donne l'erreur?

  3. #3
    Membre confirmé
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juillet 2012
    Messages
    106
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2012
    Messages : 106
    Par défaut
    Voilà le bout de code qui provoque l'erreur, en rouge d'ou vient précisément l'erreur

    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
    StatiqValues pyxfile = statDao.findByConstante("pyxfile");
    		  if (null == pyxfile) {
    
    			 StatiqValues staqval= new StatiqValues();
    			 staqval.setConstante("pyxfile");
    			 if (Cmain.getOsType().equalsIgnoreCase("WIN")) {
    				staqval.setValeur(PATHPYX + "Pyxvital.ini");
    			 } else {
    				staqval.setValeur(PATHPYX + "PyxvitalOSX.ini");
    			 }
    			 pyxvital = new File(PATHPYX + "Pyxvital.ini");
    			 statDao.persistEntity(staqval);
    		  } else {
    			 pyxvital = new File(pyxfile.getValeur());
    
    		  }
    le persist renvoi à cette méthode

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    @Override
        public Long persistEntity(StatiqValues val) {
    	   em.getTransaction().begin();
    	   	em.persist(val);
    	   	 em.getTransaction().commit();
    	   return val.getId();
        }

    je rajoute également la stack error principale, en rouge la ligne correspondante au code ci dessus

    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
    ERROR org.hibernate.engine.jdbc.spi.SqlExceptionHelper  - NULL not allowed for column "ID_STVAL"; SQL statement:
    insert into StatiqValue (ID_STVAL, commentaire, constante, valeur) values (null, ?, ?, ?) [23502-173]
    [2014-07-08 17:27:05,545] FATAL com.cwfse.websocket.WsocketHandler  - an exception was thrown
    javax.persistence.PersistenceException: org.hibernate.exception.ConstraintViolationException: could not execute statement
    	at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1387)
    	at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1310)
    	at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1316)
    	at org.hibernate.ejb.AbstractEntityManagerImpl.persist(AbstractEntityManagerImpl.java:881)
    	at com.cwfse.DAO.Implementation.JPAStatiqValuesDao.persistEntity(JPAStatiqValuesDao.java:62)
    	at com.cwfse.traitements.ObjectsToXml.CCAMAction(ObjectsToXml.java:993)
    	at com.cwfse.websocket.WsocketHandler$WSocket.onMessage(WsocketHandler.java:164)
    	at org.eclipse.jetty.websocket.WebSocketConnectionRFC6455$WSFrameHandler.onFrame(WebSocketConnectionRFC6455.java:845)
    	at org.eclipse.jetty.websocket.WebSocketParserRFC6455.parseNext(WebSocketParserRFC6455.java:359)
    	at org.eclipse.jetty.websocket.WebSocketConnectionRFC6455.handle(WebSocketConnectionRFC6455.java:235)
    	at org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:609)
    	at org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:45)
    	at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:599)
    	at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:534)
    	at java.lang.Thread.run(Unknown Source)
    Normalement hibernate est sensée me donner une ID auto generée et m'insérer mon objet, mais il me sort l'erreur. J'ai changé dans mon persitence.xml la valeur update, par create-update, et j'arrive a insérer ma valeur dans ma base lorsque je suis sous Eclipse, par contre une fois mon jar généré la même opération plante ....

  4. #4
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Citation Envoyé par Gaspard22 Voir le message
    Normalement hibernate est sensée me donner une ID auto generée et m'insérer mon objet, mais il me sort l'erreur. J'ai changé dans mon persitence.xml la valeur update, par create-update, et j'arrive a insérer ma valeur dans ma base lorsque je suis sous Eclipse, par contre une fois mon jar généré la même opération plante ....
    Il faudrait voir la structure de la table utilisée par ton serveur. Ton message me laisse à penser que, sous eclipse, tu part d'une base vide et que hibernate, du coup, crée correctement les auto increments sur la table. Par contre, sur le serveur, tu repart d'une base existante sur lequel l'auto increment n'est pas en place.

    Au fait, create-update n'est pas une valeur valable pour hibernate.hbm2ddl.auto http://docs.jboss.org/hibernate/core...ation-optional

  5. #5
    Membre confirmé
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juillet 2012
    Messages
    106
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2012
    Messages : 106
    Par défaut
    je me doutais bien que la commande create-update n'existait pas trop, j'ai essayé. Sinon le fonctionnement de ma base est le suivant.

    Ma base est préremplie par un script lors de la première init, afin que les paramètres stockés soit disponible à l'ouverture de mon appli.
    Mon appli execute des tas de choses selon desirs des utilisateurs, et va récupérer des infos dans la base
    j'arrive à faire des merge sans pb, mais le persist il ne veut pas.

    donc la table en réference a mon entity contient 20 entrées. Lors d'un test sur un fichier je demande a ma base de créer une entrée afin de stocker son chemin. et la c'est le drame.

    et quelque que soit la source ou je lance mon appli (jar independant ou eclipse ) ma base est remplie

  6. #6
    Membre Expert Avatar de jeffray03
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2008
    Messages
    1 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 501
    Par défaut
    et as-tu essayé de faire cette requete manuellement?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    insert into StatiqValue (ID_STVAL, commentaire, constante, valeur) values (null, "com1", 1, "42")
    Eric

  7. #7
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Citation Envoyé par Gaspard22 Voir le message
    Ma base est préremplie par un script lors de la première init, afin que les paramètres stockés soit disponible à l'ouverture de mon appli.
    Et on peux voir ce script? Parce que, visiblement, il a mal créé ta clé primaire.

  8. #8
    Membre éclairé
    Avatar de omar344
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juin 2007
    Messages
    287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2007
    Messages : 287
    Par défaut
    Bonjour, essaye ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    @GeneratedValue(strategy = GenerationType.IDENTITY)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [2.x] Doctrine constrainte violation sur composite fk
    Par gestrad dans le forum Symfony
    Réponses: 1
    Dernier message: 04/05/2014, 13h14
  2. pb connexion bdd via hibernate sur tomcat
    Par aurelientp dans le forum Hibernate
    Réponses: 10
    Dernier message: 25/01/2008, 20h32
  3. Protocol violation sur Oracle avec hibernate
    Par francois.chapuzot dans le forum Hibernate
    Réponses: 1
    Dernier message: 04/08/2006, 08h33
  4. [Imp]"unique constraint violated" sur un import
    Par u_roisin dans le forum Oracle
    Réponses: 10
    Dernier message: 16/02/2006, 10h55
  5. Accès à un fichier xml via hibernate
    Par boisdin dans le forum Hibernate
    Réponses: 12
    Dernier message: 20/01/2005, 14h54

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