0

次の奇妙な動作があります。

開始する前に TestValues を作成するテストケースがいくつかあります。最初にメイン エンティティが作成され、テスト値 ID とともに保存されます。これには、Springs HibernateTemplate の saveOrUpdate を使用します。

次に、いくつかの子オブジェクトが作成され、子コレクション内のこのオブジェクトにアタッチされます。(hbm.xml に cascade="save-update" があります) これらの子オブジェクトには、その時点で ID が割り当てられていません。

次に、追加の saveOrUpdate が呼び出されます。

エンティティの saveOrUpdate ごとに、追加の監査エントリがデータベースに保存されます。このため、DetachedCriteria が作成されるたびに、現在のユーザーをユーザー名で検索し、Audit エントリで参照します。その時点まで、すべてが正常に機能します。すべての子オブジェクトには ID が割り当てられます。

いくつかのプロファイリングの後、この DetachedCriteria には多くの時間がかかることがわかり、ID による HibernateTemplate の get メソッドでユーザーにアクセスできるように変更することにしました。これははるかに効率的です。

しかし、奇妙なことが起こることを知ってください。子を持つエンティティの saveOrUpdate では、子の ID が生成されず、見た目どおり、子はまったく保存されません。

ここで読んだようにhttp://www.journaldev.com/3481/hibernate-save-vs-saveorupdate-vs-persist-vs-merge-vs-update-explanation-with-examples HibernateTemplate saveOrUpdate は永続化するために異なるため、マッピングされたコレクションがフラッシュされるまで保存されないという上記の動作につながるトランザクションの外部で使用できます。だから私が理解していないのは、HibernateTemplate で detachedCriteria で findByCriteria を使用すると、なぜ異なる動作があるのか​​ということです。

findByCriteria を呼び出すと、セッションでフラッシュが呼び出されますか、または、findByCriteria の代わりに get を呼び出すと、休止状態セッションの状態が異なるのはなぜですか。auditentry、ユーザー アカウント、およびテスト値の作成中に保存されるエンティティの間に直接的な参照はありません。

PS: 現在、HibernateTemplate の使用が推奨されていないことは知っています。しかし、それは古いアプリケーションであり、完全に置き換えるには時間がかかりすぎます。

4

1 に答える 1