1

さて、私はHibernate/Springに非常に慣れていません。既存のコードをHibernate2-Hibernate4およびSpring1-Spring3からアップグレードする必要がありました。

データベースに複数のメッセージを渡すときにsaveOrUpdateを呼び出そうとすると、この例外が発生し続けます(1つのメッセージのみを送信する場合は正常に機能します)。

  org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session
  at org.hibernate.engine.internal.StatefulPersistenceContext.checkUniqueness(StatefulPersistenceContext.java:686)
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.performUpdate(DefaultSaveOrUpdateEventListener.java:293)
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.entityIsDetached(DefaultSaveOrUpdateEventListener.java:239)
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.performSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:109)
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:90)
    at org.hibernate.internal.SessionImpl.fireSaveOrUpdate(SessionImpl.java:728)
    at org.hibernate.internal.SessionImpl.saveOrUpdate(SessionImpl.java:720)
    at org.hibernate.engine.spi.CascadingAction$5.cascade(CascadingAction.java:258)
    at org.hibernate.engine.internal.Cascade.cascadeToOne(Cascade.java:380)
    at org.hibernate.engine.internal.Cascade.cascadeAssociation(Cascade.java:323)
    at org.hibernate.engine.internal.Cascade.cascadeProperty(Cascade.java:208)
    at org.hibernate.engine.internal.Cascade.cascade(Cascade.java:165)
    at org.hibernate.event.internal.AbstractSaveEventListener.cascadeBeforeSave(AbstractSaveEventListener.java:423)
    at org.hibernate.event.internal.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:264)
    at org.hibernate.event.internal.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:193)
    at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:136)
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:204)
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:189)
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.performSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:114)
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:90)
    at org.hibernate.internal.SessionImpl.fireSaveOrUpdate(SessionImpl.java:728)
    at org.hibernate.internal.SessionImpl.saveOrUpdate(SessionImpl.java:720)
    at org.hibernate.internal.SessionImpl.saveOrUpdate(SessionImpl.java:716)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.hibernate.context.internal.ThreadLocalSessionContext$TransactionProtectionWrapper.invoke(ThreadLocalSessionContext.java:352)
    at $Proxy9.saveOrUpdate(Unknown Source)

顔が青くなるまでググってみました!私はmerge()を使おうとしました。これは例外ではありませんが、mergeはNULL値をデータベースに挿入します。

evict()、flush()、同じエラーを使おうとしました。

これがエラーの原因となるメソッドです。

public void saveOrUpdate(Object obj)  {
  Session session = null;
  SessionFactory sf = getSessionFactory();

  try {
        try {
            session = sf.getCurrentSession();
        } catch (Exception e) {
            session = sf.openSession();
        }

        System.out.println("Object: " + obj);

        session.beginTransaction();
        session.saveOrUpdate(obj);
        session.getTransaction().commit();

        System.out.println("DONE");

    } catch (Exception e) {
        e.printStackTrace();
    }
}

どんな助けでも大歓迎です!

4

2 に答える 2

0

saveOrUpdateメソッドを呼び出すマッピングとコードを提供してください。エラーはsaveOrUpdateを呼び出すコードにあるようです

于 2012-11-20T09:23:25.257 に答える
0

私はそれを解決しました:)

それが最善の解決策かどうかはわかりませんが、それは私にとってはうまくいき、2日間の苦労の末に私は幸せです!

親オブジェクトからCascadeを削除し、親と子でsaveOrUpdateを明示的に呼び出しました。

助けてくれてありがとう:)

于 2012-11-20T14:01:45.997 に答える