En supposant que vous créez une nouvelle session d'hibernation pour chaque cycle de demande-réponse, il est possible de fusionner un objet détaché dans la nouvelle session d'hibernation, mais j'éviterais complètement cette approche.
Essayez plutôt de stocker une clé sur la session HttpSession qui peut être utilisée pour rechercher un utilisateur via hibernate pour chaque requête entrante. Si vous vous inquiétez des conséquences sur les performances de la consultation de la base de données pour récupérer quelque chose qui peut être stocké dans HttpSession, ne craignez pas - vous pouvez toujours utiliser un framework de mise en cache pris en charge par hibernate pour réduire le nombre de visites. Une autre façon d'améliorer les performances serait d'utiliser un verrouillage optimiste.
Bien que je n'aie pas regardé les sources d'hibernation, je pense qu'Hibernate utilise le modèle "Identity Map". Il s'agit d'une carte qui utilise l'ID de l'entité en tant que clé dans la carte et l'objet entité associé en tant que valeur dans la carte. Chaque fois qu'une entité est extraite de la session d'hibernation, Hibernate regarde la carte d'identité de la session pour voir si elle est là. Si c'est le cas, l'entité sera renvoyée de la carte. Si ce n'est pas le cas, il récupèrera l'entité de la base de données et la mettra sur la carte, puis retournera l'entité. Cela signifie que les requêtes consécutives qui accèdent à un utilisateur donné avec la même clé (id, userId, etc.) pour une session d'hibernation donnée recevront une référence au même objet User, et donc chaque requête sera capable de "voir" les modifications apportées à l'objet Utilisateur par l'autre requête. Pour cette raison, il est absolument impératif de créer une nouvelle session d'hibernation pour chaque requête entrante, afin que les demandes simultanées pour un utilisateur donné n'aient pas à verrouiller leurs threads respectifs sur leur objet User commun. Différentes sessions d'hibernation auront chacune leur propre carte d'identité et ne renverront donc pas de références au même objet Utilisateur.En essayant de fusionner un objet Utilisateur du HttpSession dans votre session d'hibernation, vous essayez essentiellement de manipuler IdentityMap d'hibernate directement, en remplaçant tout hibernate "pense" devrait être là avec quelque chose d'autre, et cela peut naturellement causer des problèmes. Comme je l'ai dit, bien qu'il soit possible de rattacher un objet détaché à une session d'hibernation, je l'éviterais. Bonne chance avec l'approche que vous prenez.
Je recommande vivement de lire ce qui suit, dans votre cas en particulier les sections sur les longues conversations et des objets détachés:
http://docs.jboss.org/hibernate/core/3.3/reference/en/html/transactions.html
rafraîchissement sur une entité non gérée est une exception! Il doit fusionner. – Affe
@Affe: Correct. Poste édité pour refléter ceci – Daniel