コード (Spring + Hibernate Web アプリケーション) で、次の例外が発生していることがわかりました。
HibernateSystemException: a different object with the same identifier value was already associated with the session
コードを確認したところ、問題の原因は同じオブジェクトを 2 回取得していたことが原因であることがわかりました。可能な限り単純なケースに変更しました。
customerDao.getById(customerId);
customerDao.getById(customerId);
上記のコードは前述の例外を引き起こしますが、Hibernate から同じオブジェクトを 2 回取得することがなぜ間違っているのかわかりません。通常の使用例のようです。つまり、2 つの異なるクエリを実行することによって、同じオブジェクトを取得できます。1 つのクエリが 2 番目のクエリと同じオブジェクトを返すかどうかを気にする必要があるのはなぜですか? 誰かがこのトピックに関する情報源を説明したり、指摘したりできますか?
PSアプリケーションでは、Hibernate の二次キャッシュが無効になっています。
アップデート:
customerDao.getById(customerId) の内容を次のように変更した場合:
Customer result = new Customer();
getHibernateTemplate().load(result, customerId);
return result;
に
return getHibernateTemplate().get(Customer.class, customerId);
例外はスローされなくなりました。load と get の違いに関する記事はインターネット上にたくさんありますが、このケースについて言及しているものはありませんでした。誰でもこのトピックに光を当てることができますか?