Bonjour à tous,
Voilà mon problème en deux mot : Une subclasse qui a une dépendance simple par une clé étrangère vers une autre classe ne génère une erreur quand je cherche à sauvegarder une instance de cette classe (J'espère que ce descriptif bref n'est pas trop obscur).
Alors voilà mon mapping :
Code:
<class name="AbstractIdentityCard" abstract="true">
<id name="id" column="ID_CARD">
<generator class="increment"/>
</id>
<property name="state" column="STATE" type="int" not-null="true"/>
<property name="creationDate" column="CREATION_DATE" type="date"/>
<!-- Mapping the Domain -->
<joined-subclass name="Domain" table="DOMAIN" >
<key column="ID_DOMAIN"/>
<many-to-one name="properties"
class="com.ao.o3s.data.Element"
column="ID_PROPERTIES"
cascade="all"
unique="true"
foreign-key="FK3_PROPERTY_ID">
</many-to-one>
</joined-subclass>
</class>
et le message d'erreur associé :
Quote:
[TestORM] - "Starting HibSession"
[TestORM] - "Beginning Transaction"
Hibernate: select max(ID_CARD) from AbstractIdentityCard
[TestORM] - "Transaction commit"
Hibernate: insert into AbstractIdentityCard (STATE, CREATION_DATE, ID_CARD) values (?, ?, ?)
Hibernate: insert into DOMAIN (ID_PROPERTIES, ID_DOMAIN) values (?, ?)
[org.hibernate.util.JDBCExceptionReporter] - "SQL Error: 0, SQLState: 23503"
[org.hibernate.util.JDBCExceptionReporter] - "ERREUR: Une instruction insert ou update sur la table «domain» viole la contrainte de clé étrangère «fk3_property_id»"
[org.hibernate.event.def.AbstractFlushingEventListener] - "Could not synchronize database state with session"
org.hibernate.exception.ConstraintViolationException: could not insert: [com.ao.o3s.sheets.Domain]
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:69)
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2077)
at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2426)
at org.hibernate.action.EntityInsertAction.execute(EntityInsertAction.java:51)
at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:243)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:227)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:140)
En observant bien au debugger l'execution , je suis arrivé au constat suivant : Hibernate n'ajoute pas la dépendance ( ici une instance de com.ao.o3s.Element) avant de stocker ma 'subclass' en tant que telle. Du coup, quand il veut insérer un nouvel élément Domain , on une violiation de clé étrangère, car la dépendance n'a pas encore réçu son "id'.
En hibernate2, je pense que la solution aurait été un
inverse=true, mais je ne trouve pas d'équivalent en Hib3 ( ce qui ne signifie pas que je regrette la suppression de ce mot-clé : ) attention ! )... J'ai essayé différentes approches mais je n'arrive pas à dire à hibernate : "stock la dépendance avant" ! N'est-ce pas le rôle de
cascade ? Ou alors ce problème est le symptôme d'un problème autres dans mon mapping, mais alors lequel ?
Merci d'avance pour toute participation ou remarque. Je suis un peu à cours de piste don c même si vous ne pensez pas avoir la solution, une question ou remarque peut m'aider merci !