Je pousse un peu l'exemple de la doc de référence Hibernate avec une mini-appli J2EE, autour des classes Event et Person.
Voici les fichiers de mapping :
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>
<class name="events.Event" table="EVENTS">
<cache usage="read-write" />
<id name="id" column="EVENT_ID">
<generator class="increment" />
</id>
<property name="date" type="timestamp" column="EVENT_DATE" />
<property name="title" />
<set name="participants" table="PERSON_EVENT" inverse="true">
<key column="EVENT_ID" />
<many-to-many column="PERSON_ID" class="events.Person" />
</set>
</class>
</hibernate-mapping>
et
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>
<class name="events.Person" table="PERSON" lazy="false">
<cache usage="read-write" />
<id name="id" column="PERSON_ID">
<generator class="native" />
</id>
<property name="age" />
<property name="firstname" length="80" />
<property name="lastname" length="80" />
<set name="events" table="PERSON_EVENT" lazy="true">
<key column="PERSON_ID" />
<many-to-many column="EVENT_ID" class="events.Event" />
</set>
<set name="emailAddresses" table="PERSON_EMAIL_ADDR" lazy="true"
cascade="all">
<key column="PERSON_ID" />
<element type="string" column="EMAIL_ADDR" />
</set>
</class>
</hibernate-mapping>
Maintenant, le problème : quand je supprime une Person possédant des Event, Hibernate me supprime aussi les entrées de la table PERSON_EVENT (ca, c'est cool).
Mais quand je supprime un Event, je me prend une
Code:
org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update
dans les dents.
Comment faire pour supprimer l'Event et ses relations ?
Voici le bout de code que j'utilise (l'événement à détruire provient d'une transaction précédente) :
Code:
Event event = (Event) request.getSession().getAttribute("evenement");
Transaction tx = beginTransaction();
getSession().delete(event);
commitTransaction(tx);
Merci !