0

アプリケーションで何かが起こっている理由を理解するのに苦労しています。springとHibernateおよびstruts2を使用すると、デバッグ中に気付いた非常に奇妙なことがいくつかあります。

ユーザーが自分の情報を編集できるユーザーフォームがあります。このフォームが送信されると、コントローラーのsave()メソッドはいくつかの処理を実行してユーザーを保存する必要があります。

奇妙なことに、コントローラーで何かを行う前に、誰がこの変更を行っているかについての情報を見つけたいと思っています。したがって、フォームを送信しているユーザーのIDに基づいて、データベースからユーザーオブジェクトをフェッチします。しかし、このユーザーオブジェクトがフェッチされたとき。次に、フォーム内のユーザーが自動的に送信されます...次のようにユーザーをフェッチしています。

User createdByUser = (User) getHibernateTemplate().find("from User u where u.username=?", username).get(0);

したがって、明らかに、何らかのメカニズムがユーザーを自動コミットしています。ほとんどの場合、createdByUserは送信されたユーザーと同じユーザーです。hibernateがこれを検出し、どういうわけかdbを同期しようとする可能性がありますか?

4

1 に答える 1

0

おそらく、管理対象エンティティに変更を加えているためです。したがって、変更はデータベースと同期され、次にそのエンティティをフェッチすると、変更が反映されたエンティティが暗黙的に取得されます。

検索を実行した後、永続コンテキストをクリアして、基になるすべてのエンティティを切り離すか、単一のエンティティをセッションから明示的に切り離すことができます。

ドキュメントから:

clear():セッションを完全にクリアします。ロードされたすべてのインスタンスを削除し、保留中のすべての保存、更新、および削除をキャンセルします。開いているイテレータまたはScrollableResultsのインスタンスを閉じないでください。

evict(object):このインスタンスをセッションキャッシュから削除します。インスタンスへの変更はデータベースと同期されません。関連付けがcascade="evict"でマップされている場合、この操作は関連付けられたインスタンスにカスケードされます。

于 2012-12-03T07:11:19.607 に答える