Bonjour,
on utilise une base Oracle 9.0 dans un projet JEE 5+Websphere 6.1+Hibernate 3+Spring, on a le prb suivant depuis 3 jours (alors que tout fonctionnait à merveille avant...) :
on a une offre commerciale qu'on créé sur une page Web. Une offre commerciale est attachée à un support (voir plus bas) par une clé étrangère (un number). A la création, pas de problème, la clé étrangère est bien renseignée.
Ensuite, on modifie l'offre commerciale a partir d'une autre page. On modifie tout sauf la clé étrangère, au moment du saveOrUpdate dans Hibernate, la valeur de la clé est bonne (identique à celle au moment de la création) mais ensuite, quand on fait un session.flush pour répercuter les modifs dans la base Oracle, la contrainte de la clé étrangère est violée par Oracle faisant planter le update.
Le plus étonnant c'est que tout fonctionnait avant. On a rien touché. On a même remis des vieilles sources du projet pour voir sans succés.
J'ai déactivé la contrainte dans la base d'Oracle pour voir la valeur insérée dans la base, c'est étrange, après le flush de la session, alors que la valeur de la clé est bonne dans l'offre commerciale coté hibernate, dans la base Oracle, la valeur insérré est ... aléatoire ! (0,06 , 1E+102 etc...).
Si quelqu'un a deja rencontré ce prb il me sera bien utile car je m'arrache les cheveux là :)
Merci
Voici le SQL des deux tables concernées : (les tables ont été réduites par rapport la réalité) :
Code:
create table BASE.SUPPORT (
REFS NUMBER not null,
A VARCHAR2(12),
constraint PK_SUPPORT primary key (REFS)
);
Code:
create table BASE.OFFRE_COMMERCIALE_DETAIL (
REFO NUMBER not null,
REFS NUMBER not null,
B VARCHAR2(12),
constraint PK_OFFRE_COMMERCIALE_DETAIL primary key (REFO)
);
Code:
alter table BASE.OFFRE_COMMERCIALE_DETAIL
add constraint FK_OFFRE_CO_OFFRE_COM_SUPPORT foreign key (REFS)
references BASE.SUPPORT (REFS)
not deferrable;
Voici le mapping :
Pour les Supports :
Code:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
<hibernate-mapping package="src.mapping">
<class
name="Support"
table="SUPPORT"
>
<meta attribute="sync-DAO">false</meta>
<id
name="Id"
type="integer"
column="REFS"
>
<generator class="increment"/>
</id>
<property
name="A"
column="A"
type="string"
not-null="false"
length="12"
/>
<set name="OffreCommercialeDetails" inverse="true" lazy="true">
<key column="REFS"/>
<one-to-many class="OffreCommercialeDetail"/>
</set>
</class>
</hibernate-mapping>
Pour les Offres commerciales :
Code:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
<hibernate-mapping package="src.mapping">
<class
name="OffreCommercialeDetail"
table="OFFRE_COMMERCIALE_DETAIL"
>
<meta attribute="sync-DAO">false</meta>
<id
name="Id"
type="integer"
column="REFO"
>
<generator class="increment"/>
</id>
<property
name="Refs"
column="REFS"
type="integer"
not-null="true"
length="22"
/>
<property
name="B"
column="B"
type="string"
not-null="false"
length="12"
/>
</class>
</hibernate-mapping>
Voici le code Java de création/Mise a jour d'une offre commerciale :
public void saveOffreCommercialeDetail(OffreCommercialeDetail o)
{
getHibernateTemplate().saveOrupdate(o);
getHibernateTemplate().flush();
}