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.