4 Réponses :


4
votes

Choisissez l'une quelconque:

1 - Vous pouvez fermer la session après avoir chargé l'entité et ouvrir une nouvelle session pour la mise à jour

2 - au lieu de créer une nouvelle entité pour la mise à jour, utilisez l'ancien et le modifiez.

3 - Détachez votre première entité de session - session.vict (myentimate)


3 commentaires

Merci pour vos idées mais je ne veux pas fermer la session et mon architecture ne me permet pas de mettre à jour l'ancien objet (en plus de beaucoup d'efforts)


@Sven pouvez-vous détacher l'entité de la session?


Ne fonctionne pas: javax.servlet.servletException: org.hibernate.sessionException: la session est fermée!



33
votes

Votre problème est que l'objet que vous avez précédemment chargé existe toujours dans votre session hibernate. Je vois deux façons de faire face à cela.

1.) Dites à la session Hibernate de fusionner votre objet modifié avec celui de la session xxx

2.) Vieux objet hors de la session avant de rédiger l'objet mis à jour à la session. session.clear () pourrait fonctionner.


2 commentaires

fusion () n'a pas fonctionné pour moi. J'ai essayé clair () et expulser (objet) avec succès


@Silentbang. Oui, je devais faire «clair ()» et 'Eversion (objet) `. On dirait que l'un ou l'autre seul devrait travailler, mais besoin de la fois.



0
votes

Au-delà d'appeler juste Clear () On the Session, on dirait que vous pourriez avoir un problème avec la façon dont vous utilisez hibernate:

Apparemment, le problème est que l'objet que je récupère de dB a le même identifiant que celui que je veux mettre à jour (comme s'il devrait être), mais ce ne sont pas les mêmes objets!

Voulez-vous dire que vous avez deux entités distinctes qui ont le même identifiant? Si tel est le cas, vous devriez trouver un champ différent qui identifie de manière unique différentes entités.


2 commentaires

Non, ils sont les mêmes objets logiques / les mêmes entités, mais Java leur donne différents objets d'objet


Comment est généré le S généré? Quel régime utilisez-vous?



16
votes

C'est un problème très courant avec hibernate. Même si vous le supprimez de la session, l'objet restera dans Hibernate persistanceContextText et vous aurez le même problème. Le problème vient également du fait que Session.Contains utilise l'égalité d'objet, et non Equals () Pour comparer l'objet ...

L'histoire est la suivante: vous avez un objet A et Objet B, qui sont le même objet logique, mais deux objets différents de votre tas Java. et vous avez il y a longtemps quelque chose avec un objet A à la session.

maintenant si vous faites session.delete (b) Vous obtiendrez l'exception, car vous essayez de Supprimer un objet qui a la même clé primaire que A, mais n'est pas un.

La solution est simple: xxx

La fusion retourne l'instance de L'objet que vous avez dans la session d'abord.


1 commentaires

C'était vraiment utile. J'ai essayé la session.viste () beaucoup de fois sans succès.