Bonjour à tous,

Voilà mon problème est assez simple:
J'ai une série de tables (A -> B -> C et A -> D). Lorsque que je récupère la liste des valeurs de B en utilisant la clé d'un A connu ; j'ai deux champs de la table C qui sont passés à null.

je voudrais savoir comment c'est possible et comment y remédier ...

Mapping de A
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
 
<hibernate-mapping>
  <class name="com.mycompany.A" table="MY_A">
    <id name="cleA" column="CLE_A" type="string" length="14">
      <generator class="assigned" />
    </id>
    <set name="bSet" inverse="true" lazy="false">
      <key column="CLE_A" />
      <one-to-many class="com.mycompany.B" />
    </set>
    <set name="dSet" inverse="true" lazy="false">
      <key column="CLE_A" />
      <one-to-many class="com.mycompany.D" />
    </set>
  </class>
</hibernate-mapping>
Mapping de B
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
 
<hibernate-mapping>
  <class name="com.mycompany.B" table="MY_B">
    <composite-id>
      <key-property name="cleA"  column="CLE_A"   type="string" length="14" />
      <key-property name="cleB1" column="CLE_B_1" type="string" length="2" />
      <key-property name="cleB2" column="CLE_B_2" type="string" length="1" />
      <key-property name="cleB3" column="CLE_B_3" type="string" length="3" />
    </composite-id>
    <many-to-one name="a" column="CLE_A" not-null="true" insert="false" update="false" lazy="false" class="com.mycompany.A" />
    <set name="cSet" inverse="true" lazy="false">
      <key>
        <column name="CLE_A" />
        <column name="CLE_B_1" />
        <column name="CLE_B_2" />
        <column name="CLE_B_3" />
      </key>
      <one-to-many class="com.mycompany.C" />
    </set>
  </class>
<hibernate-mapping>
Mapping de C
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
 
<hibernate-mapping>
  <class name="com.mycompany.C" table="MY_C">
    <composite-id>
      <key-property name="cleA"  column="CLE_A"   type="string" length="14" />
      <key-property name="cleB1" column="CLE_B_1" type="string" length="2" />
      <key-property name="cleB2" column="CLE_B_2" type="string" length="1" />
      <key-property name="cleB3" column="CLE_B_3" type="string" length="3" />
      <key-property name="cleC1" column="CLE_C_1" type="string" length="1" />
      <key-property name="cleC2" column="CLE_C_2" type="string" length="3" />
    </composite-id>
	<property name="comment1" column="COMMENT_1" type="string" length="1000" />
	<property name="comment2" column="COMMENT_2" type="string" length="1000" />
    <many-to-one name="b" column="CLE_A" not-null="true" insert="false" update="false" lazy="false">
        <column name="CLE_A" />
        <column name="CLE_B_1" />
        <column name="CLE_B_2" />
        <column name="CLE_B_3" />
    </many-to-one>
  </class>
</hibernate-mapping>
Le code Java:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
 
org.springframework.orm.hibernate3.support.HibernateDaoSupport daoSupport = null// for reference;
org.springframework.orm.hibernate3.HibernateTemplate           template   = new HibernateTemplate(daoSupport.getSessionFactory());
java.util.List bList = template.execute(
  new HibernateCallback() {
    public Object doInHibernate(Session session) {
	   Criteria criteria = session.createCriteria(B.class);
	   criteria.add(Expression.eq("cleA", "anyValue");
       return criteria.list();	   
	}
  }
 }
);
Après l'exécution de ce code, les champs COMMENT_1 et COMMENT_2 sont passés à null pour les lignes
sélectionnés.



EDIT: Le problème vient de mes setters en Java qui font des contrôles sur l'assignation du champs b dans les instances de C. Apparemment, le champs b n'est pas renseigné quand Hibernate renseigne les deux commentaires.
Cependant je ne comprends pas pourquoi Spring va mettre à jour mes données en base.