Supprimer un élément d'un-à-plusieurs collection (Java + HIbernate + Struts)

Je ne peux pas supprimer un objet enfant à partir de la base de données. À partir de la org.apache.struts.action.Action.execute() méthode, je suis de retirer l'enfant de la mère List, et aussi d'appeler session.delete(child). J'ai simplifié le code ci-dessous et ne comprenaient ce que je crois être relavent.

Hibernate Mapping

<class 
    name="xxx.xxx.hibernate.Parent" 
    table="parent">

    ...

    <list
        name="children"
        cascade="all,delete-orphan"
        lazy="true"
        inverse="true">

        <key column="parent_id"/>
        <index column="list_index"/>
        <one-to-many class="xxx.xxx.hibernate.Child"/>
    </list>
</class>

<class 
    name="xxx.xxx.hibernate.Child" 
    table="child">

    ...

    <many-to-one
        name="parent"
        class="xxx.xxx.hibernate.Parent"
        not-null="true"
        column="parent_id" />

</class>

Extrait de la méthode execute ()

Transaction tx = session.beginTransaction();  //session is of type org.hibernate.Session

try {
    Parent parent = (Parent) session.get(Parent.class, getParentId());

    Iterator i = form.getDeleteItems().iterator();  //form is of type org.apache.struts.action.ActionForm
    while(i.hasNext()){
        Child child = (Child) i.next();
        session.delete(child);
        parent.getChildren().remove(child); //getChildren() returns type java.util.List
    }

    session.saveOrUpdate(parent);
    tx.commit();
} ...

J'ai essayé avec seulement session.delete(child); et j'ai essayé avec seulement parent.getChildren().remove(child); et avec les deux lignes, le tout sans succès. Il n'y a pas d'erreurs ou d'exceptions lancées ou quoi que ce soit de la sorte. Je suis sûr que ce code est appelé (je l'ai même utilisé System.out.println(); de tracer ce qui se passe), mais la base de données n'est pas mis à jour. Je peux ajouter des enfants à l'aide de code similaire, modifier la non-perception des propriétés d'enfants existants, modifier les parents propriétés, tout cela fonctionne, tout simplement pas de la suppression!

Selon la Hibernate FAQ je suis en train de faire la cartographie de droit, et selon cette SORTE de question j'ai le droit de la logique. J'ai regardé partout sur internet et qui n'arrive pas à trouver autre chose.

Ce que je fais mal? S'il vous plaît aider! Merci.

Notes sur les versions

Tout est vieux de quelques années:

  • Java 1.4.2
  • SQL Server 2005
  • Hibernate 3.0.5
  • Struts 1.2.7
  • Apache Tomcat 5.0.28
Avez-vous remplacer égale/hashcode correctement dans l'Enfant? Avez-vous vérifier que l'Enfant est retiré de Parent après l'appel de supprimer()? Si elle ne l'est pas, vous pourriez en fait d'annuler la suppression de l'action. Il suffit de retirer l'enfant de la liste des parents et de la mise à jour de la mère (ce sera la cause de la list_index être mis à jour).

OriginalL'auteur Peter Di Cecco | 2010-01-07