Hibernate : Gestion des exceptions avec des identifiants d'objet en double
Le message d'erreur "Hibernate : un objet différent avec la même valeur d'identifiant était déjà associé au session" se produit lorsqu'Hibernate rencontre un objet avec un identifiant existant déjà associé à la session en cours. Cela peut survenir lors d'une tentative de sauvegarde ou de mise à jour d'un objet déjà présent dans la session, entraînant un conflit.
Dans le code fourni :
<code class="java">public E save(E e) { Session session = null; try { session = sessionFactory.openSession(); log.debug("session="+session.hashCode()+" save "+e); session.saveOrUpdate(e); //here throws exception session.flush(); } catch (Exception e1) { log.err("Cannot open hibernate session "+ e1.getMessage()+" cause : "+e1.getCause()); e1.printStackTrace(); } finally { if ( session != null ) session.close(); session = null;} return e ; }</code>
L'exception est levée lors de la tentative pour saveOrUpdate un bean utilisateur. La cause du problème semble être que le bean utilisateur contient une liste de beans groupe, qui à leur tour ont une liste de rôles. Lors de l'enregistrement du bean utilisateur, Hibernate tente d'enregistrer les rôles deux fois : une fois dans le cadre des beans de groupe et de nouveau dans le cadre de la liste des rôles du bean utilisateur.
userbean#1 |---|-----------***userbean.groups | | groupbean#1 | | groupbean.roles | | rolebean#1 # save relebean#1 the first time | | ---done rolebean#1 | | ------done all rolebeans of group.roles | | ---done groupbean#1 | |-----------done all groupbeans of userbean.groups |---|-----------***userbean.roles | rolebean#1 # save rolebean#1 the second time, and throws exception here! | ----done rolebean#1 | ..... |-----------done all rolebeans of userbean.roles
Pour résoudre ce problème, envisagez les approches suivantes :
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!