2010-07-20 4 views
1

possible en double:
Spring + Hibernate : a different object with the same identifier value was already associated with the sessionSupprimer un objet de la session dans Hibernate?

J'ai chargé un objet X de DB en utilisant HibernateTemplate trouver par id, je reçois des attributs de cet objet et ajouté à un autre objet Y du même type qui a également été chargé par le même ID X. Puis quand j'ai essayé de saveOrUpdate objet Y, hibernate jette l'exception un objet différent avec la même valeur d'identifiant était déjà associé à la session, ce qui signifie que l'objet X est associé à cet attribut dans la même session, donc Y peut ' t être sauvegardé ou mis à jour et affecter également cet attribut.

Comment puis-je retirer l'objet de la session X de sorte qu'il est plus associé à cet attribut

J'ai essayé d'utiliser au lieu de fusionner saveOrUpdate et il fonctionne très bien, mais est-ce la même chose que saveOrUpdate? Je veux dire, puis-je m'en servir pour ajouter de nouveaux enregistrements ou les mettre à jour?

Répondre

2

Après beaucoup d'essais, je trouve que l'utilisation de fusion est la meilleure approche pour gérer efficacement et de prendre soin des nouveaux cas d'être sauvé, je pense que la meilleure approche est de le faire:

if (X.getId() != null) { 
    return hibernateTemplate.merge(X); 
} else { 
    hibernateTemplate.saveOrUpdate(X); 
} 

Donc, s'il s'agissait d'une nouvelle instance à la session, cela se fera via saveOrUpdate, et s'il s'agit d'une instance dupliquée pour les mêmes lignes, il sera géré en utilisant la fusion.

0

Peut-être que vous pouvez essayer session.evict().

+0

Je l'ai déjà essayé, mais ça ne fonctionne pas –

+0

Pouvez-vous expliquer pourquoi vous avez même besoin de deux références, X et Y, pour le même objet? Je pense qu'hibernate garantit qu'au sein d'une session, il ne peut y avoir qu'une seule représentation en mémoire de cet objet, donc X et Y font référence à la même entité. Je pense que vous devrez supprimer l'une des références d'objet dans votre code, donc X ou Y devra aller quand vous lierez vos objcets ensemble. Ma compréhension: si vous supprimez X en utilisant session.evict(), cela supprimera également Y du cache de premier niveau d'hibernate. Je suppose que c'est pour ça que ça ne marche pas. Mais vous ne pouvez pas supprimer X et ne pas supprimer Y. –

+2

Ok dans mon cas X a un ensemble de Bs, et la couche de présentation prend cet ensemble et ajouter/mettre à jour/supprimer Bs, lors de l'enregistrement ou de la mise à jour je veux savoir quels éléments cet ensemble enlevé, donc je charge Y avec le même ID de X et de comparer entre les deux, puis en mettant à jour X puis en essayant de le sauvegarder jette le problème –