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 :

JPA Hibernate et génération auto de PK


Sujet :

Hibernate Java

  1. #1
    Membre habitué Avatar de mensoif
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    248
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 248
    Points : 129
    Points
    129
    Par défaut JPA Hibernate et génération auto de PK
    Bonjour,

    j'ai actuellement une BD avec 2 tables (Proprietaire et Maison).
    J'ai également les 2 javabeans correspondant.

    Un propriétaire peut avoir plusieurs maisons, une maison ne peut appartenire qu'à une seul personne.

    J'ai donc introduit les annotations ManyToOne et OneToMany pour représenter ce cas de figure.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    @Entity
    public class Proprietaire {
      	@Id
    	@GeneratedValue(strategy=GenerationType.AUTO)
    	private long id;
     
    	@Column(name = "name")
    	private String name;
     
    	@OneToMany(mappedBy="proprio")
    	private Collection<Maison> maisonList;
    	 ...
    }
    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
     
    @Entity
    public class Maison {
      	@Id
    	@GeneratedValue(strategy=GenerationType.AUTO)
    	private long id;
     
    	@Column(name = "adresse")
    	private String adresse;
     
           @ManyToOne
           private Proprietaire proprio;
     
    	 ...
    }
    Je cherche donc à avoir des clés primaires générées automatiquement lors de l'insertion en base et à maintenir une relation de clé étrangère entre les javabeans.

    Mon insertion en base ressemble à cela: (ma classe DAO)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    // creation et initialisation de l'EntityManagerFactory 
    public void add(T entity) {
    ...
    // creation de l'EntityManager  em
            em.getTransaction().begin();
    	em.persist(entity);
    	em.getTransaction().commit();
    // fermeture de l'em
    ...
    }
    Ainsi, lorsque je rajoute plusieurs maisons (via un dao.add(m1); où m1 m2 etc. sont des objets instanciés, j'ai éffectivement des clés primaires autogénérées qui s'incrémente comme il faut.

    Mais lorsque je tente de rajouter des Propriétaire, cette génération auto ne s'éffectue pas, et une exception de l'ordre suivant est levée:

    javax.persistence.PersistenceException: org.hibernate.exception.ConstraintViolationException: could not insert
    Je me retrouve ainsi avec seulement un objet Proprio en base comportant l'id 1.

    Pourquoi cela fonctionne t-il parfaitement avec mes Maisons et pas avec mes Proprios ?
    je n'avance plus.
    Merci pour vos conseils

  2. #2
    Modérateur
    Avatar de paissad
    Homme Profil pro
    Ingénieur de développement (Java/JEE/Eclipse RCP,EMF & webMethods)
    Inscrit en
    Avril 2006
    Messages
    1 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur de développement (Java/JEE/Eclipse RCP,EMF & webMethods)
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 043
    Points : 2 560
    Points
    2 560
    Par défaut
    Bonjour,
    avant de persister l'objet "entity", est ce que tu as vérifié que cet objet ne contient pas une valeur pour son attribut 'id' ? ... si tu veux utiliser id an AUTO_INCREMENT, il vaut mieux que l'attribut id de l'objet soit null.
    En somme, vérifie bel et bien que ton objet n'a pas une valeur id ...
    Nous n'héritons pas de la terre de nos parents, nous l'empruntons à nos enfants.
    Le chat du site est aussi ici pour aider. Ne pas hésiter à visiter !

  3. #3
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 934
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 934
    Points : 4 347
    Points
    4 347
    Par défaut
    Citation Envoyé par mensoif Voir le message
    Un propriétaire peut avoir plusieurs maisons, une maison ne peut appartenire qu'à une seul personne.
    Si vous concevez un jouet ou faites un exercice d'apprentissage, on peut l'admettre…
    si c'est pour une application "réelle", vous êtes mal parti…

    la ConstraintViolationException n'est pas nécessairement liée à votre PK… mais avoir un id non null sur persist
    est une piste : ajoutez un assertNull(entity.getId()) au début de votre add…
    comme çà si vous refaites l'erreur plus tard sur d'autres entités , vous saurez tout de suite d'où çà vient.

    mais il faudrait voir l'ensemble du stack trace et vérifier que vous ne violez pas d'autres contraintes (une Foreign Key par exemple)

  4. #4
    Membre habitué Avatar de mensoif
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    248
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 248
    Points : 129
    Points
    129
    Par défaut
    Merci pour vos pistes.

    Tout d'abord, je tiens à préciser qu'il s'agit bien d'un projet non professionnel, mais l'objectif principal est de faire "comme si". Donc je considère cette appli comme "réelle"...

    Ensuite, concernant la valeur de l'attribut id, il s'agit d'un long non initialisé, qui vaut donc 0 entre le moment où je crée l'objet et le moment où je souhaite l'insérer dans la base.
    J'ai vérifié cela, id vaut bien 0 avant et 1 après insertion.



    Selon votre hypothèse
    j'ai changé mon long pour un Long auquel j'attribue null dans le constructeur.
    Mais cela me rapporte plus de problèmes, en effet, il m'est désormais impossible de rajouter un Proprio pour cause de NullPointerException et d'impossibilité de créer mon EntityManagerFactory (PersistenceException). Néanmoins, l'assertNull passe ..

    Aurais-je mal compris ?



    Ensuite, concernant d'autre violation de contrainte, je ne pense pas; en effet, si je réduis mes ajouts via la dao à seulement des Proprios (laissons les maisons de côté pour l'instant) j'obtiens la même erreur, le premier est inséré sans problème (avec génération auto de la clé id à 1) mais l'insertion du deuxième échoue.

    Ma principale incompréhension vient du fait que je puisse insérer des Maisons et pas des Proprios, sachant que la structure de construction (hormis les relations ManyToOne et OneToMany) est identique.

    Si vous concevez un jouet ou faites un exercice d'apprentissage, on peut l'admettre…
    si c'est pour une application "réelle", vous êtes mal parti…
    Pourriez vous développer svp ? : /

  5. #5
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 934
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 934
    Points : 4 347
    Points
    4 347
    Par défaut
    Si vous modélisez le monde "réel" : un bien immeuble appartient à une ou plusieurs personnes morales ou physiques.


    Pour l'exception, il faut le stack trace complet et le code dans lequel vous créez vos propriétaires, éventuellement le DDL de la DB.

  6. #6
    Membre habitué Avatar de mensoif
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    248
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 248
    Points : 129
    Points
    129
    Par défaut
    Citation Envoyé par JeitEmgie Voir le message
    Si vous modélisez le monde "réel" : un bien immeuble appartient à une ou plusieurs personnes morales ou physiques.
    Ouf, j'avais peur que la structure de mes beans soit , je ne sais pas, foireuse.

    En réalité, ce n'est pas une appli à propos de maisons ou de proprios, j'ai pris ces exemples pour avoir un focus sur le fond et non la forme et cet exemple me paraissait bon (il ne l'était pas je vois .)

    Sinon, j'ai déterminé l'erreur.
    En effet, j'ai trop porté mon attention sur la clé primaire, mais il s'agissait d'une clause unique sur un des attributs qui n'était pas respecté ....comme vous l'aviez évoqué.
    Erreur de débutant (que je suis dans le domaine...)

    Je vous remercie pour votre temps

    Néanmoins, j'aimerais si possible avoir une dernière précision à propos de la valeur null pour l'attribut id;

    j'ai modifié mon attribut
    pour
    ceci me permettant d'attribuer null à id.
    Mais un this.id = (Long) null dans le constructeur du bean ne me semble pas être une bonne idée.

    J'écope d'une PersistenceException unable to build EntityManager accompagnée d'une hibernate.InstantiationException , nullpointexception etc.

    assertNull ne passe pas non plus.

    En gros, si j'oublie cette histoire de valeur null, tous se passe comme je le désirais (génération des clé toussa)

    Néanmoins j'aimerais savoir quel était le but de ceci ?

    Merci

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

Discussions similaires

  1. Génération de tables JPA/Hibernate
    Par Cafeinoman dans le forum Eclipse Java
    Réponses: 4
    Dernier message: 09/12/2013, 17h55
  2. [Mapping] Bug Génération auto de POJOs Hibernate base Firebird
    Par guiguitch dans le forum Hibernate
    Réponses: 0
    Dernier message: 05/04/2012, 12h52
  3. Réponses: 2
    Dernier message: 09/12/2010, 13h16
  4. Réponses: 2
    Dernier message: 22/04/2009, 10h35
  5. génération auto de la doc de la bdd d'access
    Par kenny49 dans le forum Access
    Réponses: 3
    Dernier message: 12/07/2006, 17h27

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