Die Warnung: "SCHWERWIEGEND: org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session" kann durch Hibernate ausgelöst werden, wenn man versucht ein Objekt erneut in der Datenbank zu speichern, obwohl es bereits schon einmal während derselben Session gespeichert wurde (und deshalb noch im Cache liegt).
Bei mir wurde dieser Fehler durch mein selbst erstelltes HibernateDAO ausgelöst. Ich hatte in meiner insert-Methode die Session nicht geleert und das „Value Object“ daraus nicht entfernt. Mit flush und evict lässt sich das aber lösen. Diese beiden Methoden müssen ausgeführt werden bevor die Transaktion (oder die Session) geschlossen wird, frühestens aber nach dem Ausführen der Transaktion.
Hier ein Beispiel:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | /** * Datensatz hinzufuegen. * @param vo Value Object */ public void insert(T vo) throws DAOException { try { startTransaction(); getSession().save(vo); getSession().flush(); getSession().evict(vo); closeTransaction(); } catch (HibernateException e) { rollbackTransaction(); throw new DAOException(); } } |
Auch funktionieren würde:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | /** * Datensatz hinzufuegen. * @param vo Value Object */ public void insert(T vo) throws DAOException { try { startTransaction(); getSession().clear(); getSession().save(vo); closeTransaction(); } catch (HibernateException e) { rollbackTransaction(); throw new DAOException(); } } |