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 :

Hibernate ne reçois pas correctement les id générés par mariadb [Core]


Sujet :

Hibernate Java

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut Hibernate ne reçois pas correctement les id générés par mariadb
    Bonjour,

    j'ai un soucis qui me prend un peu le choux

    Pour faire simple, j'ai une table en auto increment + une autre table avec foreign key.

    Passé une certaine valeur d'auto increment (qui curieusement se situe dans les 65536), l'id généré coté hibernate est négatif. Il est bien positif dans la DB. Résultat, quand hibernate tente de sauver un élément ayant une foreign key, ça finis en ConstraintViolationException, la db lui signifiant que, non, désolé, y a rien à ce numéro...


    Je n'arrive pas à comprendre pourquoi hibernate ramène l'id généré à un short. Pour faire simple: le code d'insertion qui tourne en boucle:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    em.getTransaction().begin();
            GLOBAL global;
            global = factory.createGlobal();
            em.persist(global);
            em.flush();
            for (int i = 0; i < 20; i++) {
              Log<ID, GLOBAL, COR> log = factory.createLog();
              log.setGlobal(global);
              em.persist(log);
            }
            em.getTransaction().commit();
    le global en question et l'id dont il hérite
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    @Entity
    public class GlobalImpl extends IdImpl implements Global<BigInteger, GlobalImpl, CorImpl> {
    ....
    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
     
    @MappedSuperclass
    public class IdImpl implements Id<BigInteger> {
      private BigInteger id;
     
      @Override
      @javax.persistence.Id
      @GeneratedValue(strategy = GenerationType.IDENTITY)
      public BigInteger getId() {
        return id;
      }
     
      @Override
      public void setId(BigInteger id) {
        this.id = id;
      }
     
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    public interface Id<ID> {
     
      public ID getId();
     
      public void setId(ID id);
     
    }
    la table mariadb
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    CREATE TABLE `GlobalImpl` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
    Et le persistence unit tout simple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
        <persistence-unit name="hibernateInteger" transaction-type="RESOURCE_LOCAL">
     
        	<class>com.xxx.entity.pkey.CorImpl</class>
        	<class>com.xxx.entity.pkey.GlobalImpl</class>
        	<class>com.xxx.entity.pkey.LogImpl</class>
        	<exclude-unlisted-classes>true</exclude-unlisted-classes>
        	<properties>
         	    <property name="hibernate.show_sql" value="true"/>
        		<property name="javax.persistence.jdbc.url" value="jdbc:mariadb://***/testAutoincrement"/>
        		<property name="javax.persistence.jdbc.user" value="***"/>
        		<property name="javax.persistence.jdbc.password" value="***"/>
        	</properties>
        </persistence-unit>
    L'erreur rapporté par hibernate:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ERROR: Cannot add or update a child row: a foreign key constraint fails (`testAutoincrement`.`LogImpl`, CONSTRAINT `FKns2pbmx0h1qnwv9cxx4cmn2ir` FOREIGN KEY (`global_id`) REFERENCES `GlobalImpl` (`id`))
    Query is: insert into LogImpl (global_id) values (?)
    Et quand je trace mes erreurs

    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
    insert failed: org.hibernate.exception.ConstraintViolationException: could not execute statement global id was -32758 last successful id was 32688 -> java.math.BigInteger
    insert failed: org.hibernate.exception.ConstraintViolationException: could not execute statement global id was -32764 last successful id was 32697 -> java.math.BigInteger
    insert failed: org.hibernate.exception.ConstraintViolationException: could not execute statement global id was -32728 last successful id was 32724 -> java.math.BigInteger
    insert failed: org.hibernate.exception.ConstraintViolationException: could not execute statement global id was -32722 last successful id was 32739 -> java.math.BigInteger
    insert failed: org.hibernate.exception.ConstraintViolationException: could not execute statement global id was -32737 last successful id was 32712 -> java.math.BigInteger
    insert failed: org.hibernate.exception.ConstraintViolationException: could not execute statement global id was -32725 last successful id was 32730 -> java.math.BigInteger
    insert failed: org.hibernate.exception.ConstraintViolationException: could not execute statement global id was -32734 last successful id was 32700 -> java.math.BigInteger
    insert failed: org.hibernate.exception.ConstraintViolationException: could not execute statement global id was -32752 last successful id was 32694 -> java.math.BigInteger
    insert failed: org.hibernate.exception.ConstraintViolationException: could not execute statement global id was -32746 last successful id was 32703 -> java.math.BigInteger
    insert failed: org.hibernate.exception.ConstraintViolationException: could not execute statement global id was -32743 last successful id was 32679 -> java.math.BigInteger
    insert failed: org.hibernate.exception.ConstraintViolationException: could not execute statement global id was -32740 last successful id was 32718 -> java.math.BigInteger
    insert failed: org.hibernate.exception.ConstraintViolationException: could not execute statement global id was -32761 last successful id was 32658 -> java.math.BigInteger
    insert failed: org.hibernate.exception.ConstraintViolationException: could not execute statement global id was -32749 last successful id was 32673 -> java.math.BigInteger
    insert failed: org.hibernate.exception.ConstraintViolationException: could not execute statement global id was -32731 last successful id was 32742 -> java.math.BigInteger
    insert failed: org.hibernate.exception.ConstraintViolationException: could not execute statement global id was -32767 last successful id was 32682 -> java.math.BigInteger
    insert failed: org.hibernate.exception.ConstraintViolationException: could not execute statement global id was -32755 last successful id was 32706 -> java.math.BigInteger
    les ids sont bien des BigInteger comme on voit. Pour chaque thread, on commence à récupérer des ids négatifs.

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Chose très amusante (hum), si je remplace le driver mariadb par le driver mysql, plus aucun soucis. Problème, le driver mariadb est celui dont j'ai besoin car il supporte le clustering de bases.

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Bon, ben c'est un bug du driver mariadb

    https://jira.mariadb.org/browse/CONJ-284

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

Discussions similaires

  1. IE n'affiche pas correctement les fichiers logs
    Par Vanito dans le forum Mise en page CSS
    Réponses: 5
    Dernier message: 02/04/2014, 19h24
  2. MaskedTextBox n'affiche pas correctement les données saisies
    Par digital prophecy dans le forum Windows Forms
    Réponses: 0
    Dernier message: 31/08/2011, 16h10
  3. Réponses: 7
    Dernier message: 02/02/2011, 09h15
  4. [AC-2007] requête qui ne traite pas correctement les données
    Par Oliv'83 dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 24/11/2010, 12h07
  5. [Hibernate] Hibernate ne marche pas avec les servlets!
    Par IM2009 dans le forum Hibernate
    Réponses: 3
    Dernier message: 23/11/2009, 22h29

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