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 :

Mise à jour de données dans une BD via Hibernate


Sujet :

Hibernate Java

  1. #1
    Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2007
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juillet 2007
    Messages : 39
    Points : 44
    Points
    44
    Par défaut Mise à jour de données dans une BD via Hibernate
    Bonjour a tout le monde,

    Je découvre en ce moment Hibernate et je développe une petite application qui me permet de mettre en oeuvre mes connaissances.

    ci-dessous mes descripteurs XML simplifiés:
    - contrat
    - personne
    - societe

    => une personne peut être associée à une même société de plusieurs façons (TYPE)

    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
     
    <?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
    <hibernate-mapping>
        <class name="ContratEntite" table="CONTRAT">
            <composite-id>
          		<key-property name="identPersonne" column="NOPERS" />
          		<key-property name="identSociete" column="SOCIETE" />
          		<key-property name="typeContrat" column="TYPE" />
        	</composite-id>
            <many-to-one name="personne" class="PersonneEntite" fetch="join" insert="false" update="false">
                <column name="NOPERS" />
            </many-to-one>
            <many-to-one name="societe" class="SocieteEntite" fetch="join" insert="false" update="false">
                <column name="SOCIETE" />
            </many-to-one>
            <property name="typeContrat" type="char" insert="false" update="false">
                <column name="TYPE" />
            </property>
        </class>
    </hibernate-mapping>
    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
     
    <?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
    <hibernate-mapping>
        <class name="PersonneEntite" table="PERSONNE">
            <id name="id" type="java.lang.Integer">
                <column name="NOPERS" />
                <generator class="assigned" />
            </id>
            <property name="nom" type="java.lang.String">
                <column name="NOM" />
            </property>
            <set name="listeLabel" table="CONTRAT" inverse="false" lazy="true">
                <key>
                    <column name="NOPERS" />
                </key>
                <one-to-many class="ContratEntite" />
            </set>
        </class>
    </hibernate-mapping>
    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
     
    <?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
    <hibernate-mapping>
        <class name="SocieteEntite" table="SOCIETE">
            <id name="id" type="java.lang.Integer">
                <column name="NOSOC" />
                <generator class="assigned" />
            </id>
            <property name="nom" type="java.lang.String">
                <column name="DENOMINATION" />
            </property>
        </class>
    </hibernate-mapping>

    Au niveau de la lecture, tout se passe bien.

    Mon problème se pose au moment où j'essaye de rajouter une société (déjà créée) à une personne (déjà existante elle aussi) : j'ai un message indiquant qu'un des champ de ma clé ne peut pas contenir de valeurs NULL.

    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
     
    Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Le champ 'NOPERS' ne peut être vide (null)
    	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
    	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    	at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
    	at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
    	at com.mysql.jdbc.Util.getInstance(Util.java:386)
    	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1039)
    	at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3609)
    	at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3541)
    	at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2002)
    	at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2163)
    	at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2624)
    	at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2127)
    	at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2427)
    	at com.mysql.jdbc.PreparedStatement.executeBatchSerially(PreparedStatement.java:1980)
    	... 58 more

    Quand je demande à afficher les logs hibernate, il essaie effectivement de mettre à jour la donnée du contrat avec une valeur NULL

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Hibernate: update CONTRAT set NOPERS=null where NOPERS=?
    Pour info, la base de données est sur MySQL et l'IHM développé en GWT mais je pense que mon problème est dans la description des xml ci-dessus.

    Merci d'avance à tous ceux qui peuvent m'aider.

  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
    Si tu montrais le code que tu utilise pour mettre à jour ta donnée.

  3. #3
    Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2007
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juillet 2007
    Messages : 39
    Points : 44
    Points
    44
    Par défaut
    Ci-dessous quelques extraits du code

    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
     
    	public PersonneServiceReponse personneModification(PersonneServiceRequete requete) throws IllegalArgumentException, IdentiteException {
     
    		PersonneServiceReponse reponse = new PersonneServiceReponse();
     
    		Transaction tx = null;
    		try {
    			Session session = SessionFactoryHolder.getCurrentSession();
    			tx = session.beginTransaction();
     
    			Personne personne = requete.getPersonne();
     
    			PersonneEntite aEntite = getPersonneEntite(personne, personne.getId(), session);
     
    			session.update(aEntite);
     
    			tx.commit();
    		} finally {
    			if (tx != null && tx.isActive()) {
    				tx.rollback();
    			}
    		}		
     
    		return reponse;
    	}
    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
     
    	private PersonneEntite getPersonneEntite(Personne personne, int ident, Session session) throws IdentiteException {
     
    		PersonneEntite aEntite = new PersonneEntite();
    		aEntite.setId(ident);
    		aEntite.setPseudonyme(personne.getPseudonyme());
     
    		HashSet<ContratEntite> listeSociete = new HashSet<ContratEntite>();
     
    		LabelDAO dao = new LabelDAO(session);
     
    		Societe societe = artiste.getMaisonDisque();
    		if ((null != societe) && (!Util.isNullOrEmpty(societe.getNom()))) {
    			SocieteEntite sEntite;
    			try {
    				sEntite = dao.getRechercheCode(societe.getNom());
    			} catch (IdentiteException e) {
    				throw e;
    			}
     
    			ContratEntite cEntite = new ContratEntite(aEntite, sEntite, TypeContrat.PRINCIPAL.getCode());
     
    			listeLabel.add(cEntite);
    		}
     
     
    		aEntite.setListeLabel(Societe);
     
    		return aEntite;
    	}
    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
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
     
    	public class ContratEntite implements Serializable {
     
    		public static class Id implements Serializable {
     
     
    			private int identPersonne = 0;
     
    			private int identSociete = 0;
     
    			private char typeContrat = ' ';
     
    			public Id() {
    			}
     
     
    			public int getIdentPersonne() {
    				return identPersonne;
    			}
     
     
    			public void setIdentPersonne(int identPersonne) {
    				this.identPersonne = identPersonne;
    			}
     
    			public int getIdentSociete() {
    				return identSociete;
    			}
     
    			public void setIdentSociete(int identSociete) {
    				this.identSociete = identSociete;
    			}
     
     
    			public char getTypeContrat() {
    				return typeContrat;
    			}
     
     
    			public void setTypeContrat(char typeContrat) {
    				this.typeContrat = typeContrat;
    			}
    		}
     
     
    		private Id id = new Id();
     
    		private PersonneEntite artiste;
     
    		private SocieteEntite societe;
     
    		private char typeContrat;
     
     
    		public ContratEntite() {
    		}
     
    		public ContratEntite(PersonneEntite artiste, SocieteEntite societe, char typeContrat) {
    			getId().setIdentPersonne(personne.getId());
    			getId().setIdentSociete(societe.getId());
    			getId().setTypeContrat(typeContrat);
     
    			setArtiste(artiste);
    			setSociete(societe);
     
    			this.typeContrat = typeContrat;
    		}
     
     
    		public Id getId() {
    			return id;
    		}
     
    		public void setId(Id id) {
    			this.id = id;
    		}
     
     
    		public int getIdentPersonne() {
    			return getId().getIdentPersonne();
    		}
     
     
    		public void setIdentPersonne(int identPersonne) {
    			getId().setIdentPersonne(identPersonne);
    		}
     
     
    		public int getIdentSociete() {
    			return getId().getIdentSociete();
    		}
     
    		public void setIdentSociete(int identSociete) {
    			getId().setIdentSociete(identSociete);
    		}
     
     
    		public PersonneEntite getPersonne() {
    			return Personne;
    		}
     
    		public void setPersonne(PersonneEntite personne) {
    			this.personne = personne;
    		}
     
    		public SocieteEntite getSociete() {
    			return societe;
    		}
     
    		public void setSociete(SocieteEntite societe) {
    			this.societe = societe;
    		}
     
     
    		public char getTypeContrat() {
    			return typeContrat;
    		}
     
    		public void setTypeContrat(char typeContrat) {
    			this.typeContrat = typeContrat;
    		}
    }
    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
     
    public class PersonneEntite implements Serializable {
     
     
    	private int id;
     
    	private String non;
     
    	private Set<ContratEntite> listeLabel;
     
     
    	public PersonneEntite() {
    	}
     
     
    	public int getId() {
    		return id;
    	}
     
    	public void setId(int id) {
    		this.id = id;
    	}
     
     
    	public String getNom() {
    		return nom;
    	}
     
    	public void setNom(String nom) {
    		this.nom = nom;
    	}
     
     
    	public Set<ContratEntite> getListeSociete() {
    		return listeSociete;
    	}
     
     
    	public void setListeSociete(Set<ContratEntite> listeLabel) {
    		this.listeSociete = listeSociete;
    	}
    }
    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
     
    public class SocieteEntite implements Serializable {
     
    	private int id;
     
    	private String nom;
     
    	public SocieteEntite() {
    	}
     
     
    	public int getId() {
    		return id;
    	}
     
    	public void setId(int id) {
    		this.id = id;
    	}
     
     
    	public String getNom() {
    		return nom;
    	}
     
    	public void setNom(String nom) {
    		this.nom = nom;
    	}
     
    }
    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
     
    	public SocieteEntite getRechercheCode(String nom) throws IdentiteException {
     
    		String requeteSQL = "select s from SocieteEntite s where nom = ?";
    		Query query = mySession.createQuery(requeteSQL);
    		query.setString(0, nom);
     
    		List<String> listeSociete = (ArrayList<String>) query.list();
     
    		if ((null == listeSociete) || (1 != listeSociete.size())) {
    			throw new IdentiteException(this.getClass().getName(), "getRechercheCode", "Code Societe non trouve " + nom);
    		}
     
    		Object result = listeLabels.get(0);
     
    		return (SocieteEntite) result;
    }
    Merci.

  4. #4
    Membre chevronné 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
    Points : 2 120
    Points
    2 120
    Par défaut
    Salut,

    dans la ligne ci-dessous:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    PersonneEntite aEntite = getPersonneEntite(personne, personne.getId(), session);
    verifies bien que la personne recuperée , possede bien un id avec de faire l´actualisation.

    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
    public PersonneServiceReponse personneModification(PersonneServiceRequete requete) throws IllegalArgumentException, IdentiteException {
     
    		PersonneServiceReponse reponse = new PersonneServiceReponse();
     
    		Transaction tx = null;
    		try {
    			Session session = SessionFactoryHolder.getCurrentSession();
    			tx = session.beginTransaction();
     
    			Personne personne = requete.getPersonne();
     
    			PersonneEntite aEntite = getPersonneEntite(personne, personne.getId(), session);
                            if(aEntite.getId() !=null)
                            {
    			session.update(aEntite);
     
    			tx.commit();
                            }
    		} finally {
    			if (tx != null && tx.isActive()) {
    				tx.rollback();
    			}
    		}		
     
    		return reponse;
    	}
    Eric

  5. #5
    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
    Ta méthode "private PersonneEntite getPersonneEntite(Personne personne, int ident, Session session)" n'est pas top. Elle crée de toutes pièces une nouvelle entité qui va servir au save, plutôt que d'interroger Hibernate pour avoir l'entité qui correspond à la clé. Donc tu ne peux pas savoir si l'id que tu as reçu est correct ni si il existe une entité avec cet id. De plus, si l'entité existe déjà de manière active dans la session, tu va avoir de jolies exceptions pour entités dupliquées.

    Le problème il est là:

    Hibernate: update CONTRAT set NOPERS=null where NOPERS=?

    Pourquoi hibernate fait ça? Simplement parce que tu sauve une personnes tout neuve que tu viens de créer (au lieu de la récupérer), mais incomplète. Du coup elle a pas de contrat. Du coup que fait hibernate? Ben il met à null la clé sur les contrat dans la DB pour les détacher. Oui mais la contrainte non null interviens et fait tout foirer.


    Que faire:

    Si tu voulais effectivement supprimer les contrats (admettons), il faut penser à mettre sur la cascade de la relation personne => contrat la règle "delete-orphan"
    Si tu voulais conserver les contrat, faut revoir ta méthode pour qu'elle mette une jour une vrai entité, par une coquille vide que tu viens de créer (session.get au lieu de new PersonneEntite)

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

Discussions similaires

  1. Mise à jours des données d'une Datagrid dans un UserControl ?
    Par mastronic dans le forum Windows Forms
    Réponses: 3
    Dernier message: 22/07/2011, 12h27
  2. Mise à jour de données dans une table
    Par Sixers33 dans le forum IHM
    Réponses: 20
    Dernier message: 03/10/2008, 15h59
  3. Mise à jour de données dans une table
    Par Stargate SG1 dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 17/04/2008, 18h38
  4. Mise à jour des données dans une colonne
    Par BZH75 dans le forum SQL
    Réponses: 9
    Dernier message: 09/01/2008, 16h18
  5. [Debutant] mise à jour de donnée dans une base access
    Par brissou #55 dans le forum Windows Forms
    Réponses: 12
    Dernier message: 25/12/2007, 21h28

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