Hibernate: Supprimer un élément d'une liste ne persiste pas
J'ai de la difficulté lors de la suppression d'un élément dans une liste. La liste est définie dans une super-classe, mais les Hibernate annotations sont appliquées à des accesseurs de propriété dans une sous-classe. Il existe deux méthodes de la super-classe pour manipuler la liste. Le "ajouter" méthode fonctionne très bien, mais le "supprimer" ne pas conserver les modifications. J'ai vérifié mes Cascade de paramètres, et j'ai l'impression d'avoir des choses à corriger. Suis-je en train de faire quelque chose qui est impossible. Si non, suis-je en train de faire quelque chose de mal?
Voici mes classes:
@Entity
abstract class Temporal<T> {
@Id
@GeneratedValue
private Long id;
@Version
private Integer version = null;
@Transient
protected List<T> content = new ArrayList<T>();
public void remove(T value) {
//business logic ...
content.remove(value);
}
public void add(T value) {
//business logic ...
content.add(value);
}
}
@Entity
@AccessType("property")
class TemporalAsset extends Temporal<Asset> {
@OneToMany(cascade = CascadeType.ALL, mappedBy = "temporal")
public List<Asset> getContent() {
return super.content;
}
protected void setContent(List<Asset> list) {
super.content = list;
}
}
Je utiliser une instance de la TemporalAsset classe comme suit (notez que je suis, utilisez uniquement le "refresh" méthode pour démontrer le comportement. La liste ne persiste pas correctement, même si je tire la chasse, ou fermez la session et ouvrez une nouvelle session):
temporalAsset.add(value1);
temporalAsset.getContent().size() == 1; //true
session.update(temporalAsset);
session.refresh(temporalAsset);
temporalAsset.getContent().size() == 1; //true
temporalAsset.remove(value1);
temporalAsset.getContent().size() == 0; //true
session.update(temporalAsset);
session.refresh(temporalAsset);
temporalAsset.getContent().size() == 0; //false, its 1
Grâce.
source d'informationauteur codefinger | 2009-02-14
Vous devez vous connecter pour publier un commentaire.
Vous devez spécifier explicitement cascade CascadeType.DELETE_ORPHAN.
Essayer de changer le code pour
Le cadre de mise en veille prolongée docs:
Essayez de supprimer les appels à la Session.refresh(). À partir de la documentation:
http://www.hibernate.org/hib_docs/v3/api/org/hibernate/Session.html#refresh(java.lang.Objet)
Si vous appelez la méthode flush() avant de les actualiser(), qui pourrait résoudre le problème aussi, depuis flush() garantit que toute l'attente de SQL sera exécutée à l'encontre de la DB. Dans la pratique, je l'ai presque jamais vu personne utiliser refresh() et ça ne ressemble pas à partir de votre code que vous en avez besoin.
Ce chapitre à partir de la documentation est intéressant à lire:
http://www.hibernate.org/hib_docs/v3/reference/en/html/objectstate.html
Vous avez marqué le "contenu" champ transitoire dans la super-classe. J'aurais au moins suspect que c'est la cause des problèmes. Avec la cartographie de la sous-classe, en gros, vous avez maintenant deux contredire mappages pour le même attribut.