0

ユーザーが自分のユーザー名を変更できる設定ページを作成しています。奇妙なことに、メイン ビューとフォームで表示するために同じファインダー メソッドを使用していますが、オブジェクトは互いに関連していません。

ユーザー名を入力せずに保存をクリックすると、副作用が発生します。両方のオブジェクトが更新されます。ビューの表示も間違っています。

別のモデルの形で使用したいだけです。ここで何が間違っていますか?「Model.find」を呼び出すと、データベース内の同じ行であっても、オブジェクトの異なる参照が毎回返されると思いました。play はここでインテリジェントなキャッシュを行っていますか?

フォーム内のユーザーを変更すると、ビュー内の他のすべての同じユーザー オブジェクトが変更されるため、非常に面倒です。

作成/編集ページをレンダリングするためのアクション:

public static void index(){
        User appUser = User.findUser(SecureSocial.getCurrentUser().id);
        render(appUser);
 }

マイ ビュー (現在ログインしているユーザー名が表示されます)

${models.User.findUser(user.id).username}

私のモデル:

public static User findUser(UserId userId){
        User user = User.find("externalId = ? and provider = ?", userId.id, userId.provider.name()).first();
        return user;
}

ありがとう

4

1 に答える 1

0

Hibernate が永続ストレージをサポートしています。Hibernate は、1 つのトランザクション内の 1 つの永続的な (論理) オブジェクトに対して、多くの理由からそのインスタンスを 1 つだけ作成して保持します。したがって、あなたが説明する動作は実際に期待されるものです。

詳細については、http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/objectstate.html#objectstate-overview を参照してください

オブジェクトの 2 つのインスタンスを同時に持つには、それを切り離す (つまり、Hibernate の用語で DB オブジェクトへのリンクを削除する) 必要があります。通常、編集されたオブジェクトをデタッチし、オブジェクトをレンダリングのみにします。

したがって、コントローラー関数を変更して、編集されているオブジェクトを切り離します。

User.em().detach(user);

于 2012-07-28T10:09:15.290 に答える