8
votes

Pourquoi la session.vict est-elle dans Onpostupdate causant une exception "possible accès à la session" à la session "?

J'ai un utilisateur qui a un certain nombre de rôles. L'utilisateur est lié aux rôles à l'aide d'une table d'entité de liaison. J'ai défini le fichier de configuration sur cascade Supprimer les entités de liaison de rôle d'utilisateur lorsqu'un utilisateur est supprimé.

Nous utilisons actuellement Soft Suppr pour supprimer des entités. Nous avons ajouté un auditeur d'événements Soft Supprimer qui est déclenché par une suppression. Lorsqu'une entité est supprimée, elle déclenche l'événement deletéentity qui marque l'entité comme supprimé.

Nous avons également une substitution de remplacement de l'événement OnPostUpdate pour supprimer Les entités de la cache en appelant expulser sur l'entité.

Si je crée un utilisateur sans aucun rôle, supprimez-le, tout fonctionne bien (cela fonctionne également si une cascade handicapée). Toutefois, si j'ai un utilisateur avec au moins un rôle attribué et que je supprime l'utilisateur, après l'appel à expulser dans ongostupdate , je reçois une exception NHibernate "Nhibernate.ASSERTIONNEFAILURE: ACCÈS POSSIBLE NONTHADEDSAFE à Session".

J'ai essayé, dans Onpostupdate , pour utiliser la session enfant pour expulser l'entité, l'exception n'est pas lancée, toutefois, l'entité n'est pas expulsée. < Pré> xxx

Des idées sur la façon de le résoudre?


0 commentaires

3 Réponses :


3
votes

a trouvé quel était le problème. Utiliser Soft Suppr Delete déclenchera réellement la mise à jour pour définir le drapeau ISDOTED. En raison de cette ligne dans une mappage

  cascade="persist, merge, save-update, delete, lock, refresh"


0 commentaires

1
votes

J'ai couru dans le même problème, mais puisque j'utilise des mappages fluides, il n'y a aucune option pour exclure expulser de la cascade. Ma solution consistait à éviter appeler expulser et simplement supprimer l'entité du cache de session: xxx


0 commentaires

14
votes

Selon https://forum.hibernate.org/viewtopic.php?p= 2424890 Une autre façon d'éviter cela est d'appeler essentiellement

          session.save(s);
          session.flush(); // allow evict to work
          session.evict(s);


2 commentaires

C'était aussi mon problème, bien que j'utilisais Hibernate via l'interface JPA et j'avais affaire à EM.Persist (...), Em.Flush () et Em.Detach (...).


Donc, le cas est "une entité nouvellement créée a été détachée (expulsée) de la session avant d'être enregistrée à la DB"