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 :

Problème valeur null lors du UPDATE


Sujet :

Hibernate Java

  1. #1
    Membre à l'essai
    Inscrit en
    Octobre 2004
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 32
    Points : 23
    Points
    23
    Par défaut Problème valeur null lors du UPDATE
    Bonjour à tous,

    Je suis débutant avec Hibernate et je me retrouve confronté à un problème que je n'arrive pas à résoudre.

    J'ai une table Personne (
    id INT PRIMARY KEY,
    nom VARCHAR NOT NULL DEFAULT '',
    prenom VARCHAR NOT NULL DEFAULT '',
    profession VARCHAR NOT NULL DEFAULT '');

    Je veux que les champs nom, prenom et profession ne soient pas null mais qu'ils aient la chaîne vide comme valeur par défaut s'il ne sont pas renseignés.

    Dans le fichier de mapping de la table Personne, j'ai spécifié les attributs dynamic-insert="true" et dynamic-update="true".

    Lorsque je fait un INSERT il n'y a pas de problème, le code suivant fonctionne très bien:
    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
     
    private void creerPersonne()
    	{
    		Session session = HibernateUtil.currentSession();
     
    		Transaction tx = session.beginTransaction();
    		Personne personne = new Personne();
    		personne.setNom("NomFamille");
    		personne.setPrenom("Prénom");			
    		session.saveOrUpdate(personne );
     
    		tx.commit();
     
    		HibernateUtil.closeSession();
    	}
    Comme vous le voyez, le champ Profession n'a pas été renseigné donc lors de l'insert la valeur enregistrée sera la chaîne vide ''.

    Mon problème vient ensuite si j'essaye de modifier la personne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    // Récupération de la personne
    ...
    personne.setPrenom("NouveauPrénom");
    session.saveOrUpdate(personne );
     
    tx.commit();
     
    HibernateUtil.closeSession();
    C'est ici que j'obtiens une erreur au moment de l'enregistrement en base :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Caused by: org.h2.jdbc.JdbcBatchUpdateException: NULL not allowed for column "PROFESSION"; SQL statement:
    update personne set nom=?, prenom=?, profession=? where ID=? [90006-137]
    En fait, j'ai vérifié la valeur de profession avant l'enregistrement de la personne et il est null au lieu d'être la chaîne vide.

    Je pensais que le fait d'avoir spécifié l'option dynamic-update="true" corrigerait le problème mais je pense qu'Hibernate essaye d'enregistrer le champ profession justement parce qu'il a changé de valeur (null en structure alors qu'en base il est la chaîne vide). Peut-être que la solution au problème serait de réussir à charger en structure la valeur par défaut au lieu de null mais je ne sais pas comment faire.

    Bref, je suis un peu perdu donc je m'en remet à vos connaissance d'Hibernate.

    Merci d'avance pour votre aide,

    Florian

  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
    Quelle base de donnée? Sous oracle, une chaine vide équivaut à un NULL, tu aura donc des problèmes avec

    Est-ce que tu as un cache de second niveaux? Si oui essaie de le désactiver, c'est peut être lui qui ramène le null. Si la session est différente de celle qui a fait l'insert, le cache de premier niveau ne jouera pas.

    Enfin, pour mettre coté code les valeur par défaut, le plus simple est de faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public class MaClasse {
       private String nom="";
       private String prenom=""; 
       .....
    }
    Quand à l'update, hibernate ne tracke pas les champs individuel, il update toute la ligne d'un coup.

  3. #3
    Membre à l'essai
    Inscrit en
    Octobre 2004
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 32
    Points : 23
    Points
    23
    Par défaut
    Tout d'abord merci pour la rapidité de ta réponse.

    J'utilise une base H2.

    Je travaille sous Eclipse et j'utilise le pluging Hibernate Synchronizer. Le problème de mettre les valeurs par défaut côté code directement dans la classe est que lorsque j'apporte une petite modification au fichier de mapping, Hibernate Synchronizer reconstruit entièrement toute la classe et supprime les valeurs par défaut que j'avais mises.

  4. #4
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 311
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 311
    Points : 9 524
    Points
    9 524
    Billets dans le blog
    1
    Par défaut
    Quel est le mapping lié à ta classe Personne ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre à l'essai
    Inscrit en
    Octobre 2004
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 32
    Points : 23
    Points
    23
    Par défaut
    Le voici:

    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
     
    <?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping PUBLIC
    	"-//Hibernate/Hibernate Mapping DTD//EN"
    	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
     
    <hibernate-mapping package="sdd.per">
    	<class name="Personne" table="personne" dynamic-insert="true" dynamic-update="true">
    		<id name="id" type="java.lang.Long">
                <column name="ID" sql-type="BIGINT"/>
    			<generator class="native" />
    		</id>
    		<property name="Nom" not-null="true" type="string">
    		 	<column name="nom" sql-type="VARCHAR(255)" default=""/>
    		</property>
    		<property name="Prenom" not-null="true" type="string">
    		 	<column name="prenom" sql-type="VARCHAR(255)" default=""/>
    		</property>
    		<property name="Profession" not-null="true" type="string">
    		 	<column name="profession" sql-type="VARCHAR(255)" default=""/>
    		</property>
    	</class>
    </hibernate-mapping>

  6. #6
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 311
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 311
    Points : 9 524
    Points
    9 524
    Billets dans le blog
    1
    Par défaut
    Ben c'est normal, tu as mis

    <property name="Profession" not-null="true"...>
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  7. #7
    Membre à l'essai
    Inscrit en
    Octobre 2004
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 32
    Points : 23
    Points
    23
    Par défaut
    Même en mettant not-null="false" ça me donne la même chose. J'avais mis not-null="true" car c'est le cas dans ma base de données, les champs sont à not-null mais possèdent une valeur par défaut lors de l'insert si le champ n'est pas renseigné.

  8. #8
    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
    as-tu controlé le cache de second niveau. Quand tu fais une nouvelle session hibernate, si ce cache n'existe pas, hibernate ira toujours chercher les données en base, donc avec des String vide et non plus des nulls.

  9. #9
    Membre à l'essai
    Inscrit en
    Octobre 2004
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 32
    Points : 23
    Points
    23
    Par défaut
    D'après ce que j'ai vu sur Internet le cache de second niveau n'est pas activé par défaut. Donc vu que je ne l'ai pas configuré je pense qu'il ne devrait pas être activé, non ?

  10. #10
    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
    normalement, par défaut il n'est pas actif. Pour être sur tu peux mettre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <property name="hibernate.cache.use_second_level_cache">true</property>
    Dans ton fichier de config.

Discussions similaires

  1. Impossible d'insérer la valeur NULL avec un UPDATE synchronisé
    Par Selenza dans le forum Développement
    Réponses: 4
    Dernier message: 30/06/2015, 09h32
  2. Réponses: 2
    Dernier message: 22/07/2014, 14h54
  3. Accès à une table ACCESS par VB: Problème valeur NULL
    Par stef33150 dans le forum Accès aux données
    Réponses: 8
    Dernier message: 12/02/2010, 15h29
  4. [MySQL] problème update champ float valeur null
    Par dubitoph dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 25/02/2009, 11h42
  5. Valeur null lors de la lecture apres un insert
    Par omlip dans le forum Hibernate
    Réponses: 1
    Dernier message: 07/07/2006, 13h56

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