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:
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:
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:
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:
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:
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.