Bonjour à tous,
je me permet de ressortir ce vieux topic pour eviter d'en recréer un étant donné que j'ai le même problème qui me revient sur un projet différent et j'aimerais le résoudre une fois pour toute.
Donc au niveau des technologies utilisées, j'utilise toujours hibernate 3 / spring et Tomcat en serveur.
Mes tables sont : Center, Cycle, Patient, Product, Status.
Product, Status sont de simples tables de références.
Voiçi les hbm des 2 tables qui nous interesse pour le problème (Center et Cycle) :
Code:
<?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
default-lazy="false"
auto-import="true"
default-cascade="save-update"
package="com.appli.model">
<class name="Center" table="CENTER">
<id name="id" type="integer">
<generator class="sequence">
<param name="sequence">center_id_sequence</param>
</generator>
</id>
<property name="name" type="string" length="50" not-null="true"/>
<property name="address" type="string" length="100" not-null="true"/>
<property name="postalCode" type="string" length="50" not-null="true"/>
<property name="area" type="string" length="50" not-null="true"/>
<!-- Patient Association -->
<set name="patients" inverse="true">
<key column="center"/>
<one-to-many class="Patient"/>
</set>
</class>
</hibernate-mapping>
La table Cycle :
Code:
<?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
default-lazy="false"
auto-import="true"
default-cascade="save-update"
package="com.appli.model">
<class name="Cycle" table="CYCLE">
<id name="id" type="integer">
<generator class="sequence">
<param name="sequence">cycle_id_sequence</param>
</generator>
</id>
<property name="cycleNumber" type="integer" length="50" not-null="true"/>
<property name="q300Iu" type="integer" length="50" not-null="true"/>
<property name="q600Iu" type="integer" length="50" not-null="true"/>
<property name="q900Iu" type="integer" length="50" not-null="true"/>
<property name="startDate" type="date" not-null="true"/>
<property name="createDate" type="date" not-null="true"/>
<property name="modifiedDate" type="date" not-null="true"/>
<!-- Patient Association -->
<many-to-one name="patient" class="Patient" not-null="true"/>
<!-- Center Association -->
<many-to-one name="center" class="Center" not-null="true"/>
<!-- Status Association -->
<many-to-one name="status" class="Status" not-null="true"/>
<!-- Product Association -->
<many-to-one name="product" class="Product" not-null="true"/>
</class>
</hibernate-mapping>
Mon application fonctionne comme comme suit :
Un utilisateur se connecte via un login de centre (Center :) ).
Si le user / mot de passe sont corrects je charge le center de la base et je le stocke dans ma session http.
Le user peut ensuite aller voir la liste des patients du centre. Un clic sur un patient lui permet de creer des cycles.
J'ai donc un formulaire qui permet d'entrer les infos du cycle.
Une fois le formulaire validé, je crée un objet Cycle et je lui stocke les infos. Au niveau du Center, je vais chercher celui que j'ai stocké dans ma session http et je le set dans mon objet Cycle.
Une fois l'objet Cycle rempli je fais un save et la j'obtient l'erreur :
Code:
org.springframework.orm.hibernate3.HibernateSystemException: a different object with the same identifier value was already associated with the session: [com.appli.model.Center#1]; nested exception is org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session: [com.appli.Center#1]
Voiçi ma classe ou je fais le save :
Code:
package com.appli.orm.hibernate.dao;
import org.springframework.orm.hibernate3.SessionFactoryUtils;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import com.appli.dao.CycleDao;
import com.appli.model.Center;
import com.appli.model.Cycle;
import com.appli.orm.hibernate.interceptor.CycleInterceptor;
public class CycleDaoImpl extends HibernateDaoSupport implements CycleDao{
public void save(Cycle cycle) {
getHibernateTemplate().setEntityInterceptor(new CycleInterceptor());
getHibernateTemplate().saveOrUpdate(cycle);
}
}
J'ai essayé de faire un evict de l'objet cycle que j'ai en paramètre mais ca ne change rien.
J'ai également configuré spring pour que l'hibernateTemplate crée une nouvelle session à chaque fois.
Effectivement lorsque je fais un débug de mon appli et que je met un point d'arret avant de sauvegarder, dans ma session hibernate j'ai bien un objet de type Center mais je n'ai pas moyen de l'enlever ...
J'ai essayé un flush également mais rien n'y fait.
Ce post est mon dernier recours avant de faire moi même la sauvegarde avec une requete HQL, mais bon j'aimerai eviter d'utiliser cette méthode.
En esperant que vous trouverez une solution :)
Merci