1

意見 :

#{form @UserController.editUser()}


<input type="hidden" value=${user?.id} name="user.id">


  #{input key:'user.instructions', label: 'Instructions', value: user?.instructions /}               

//// Assume the value of the instructions is "Old" (currently in the database) and the user changes it in the view to "New" using the input box

***(input is a tag I created.)***



  <div class="form-actions">

          <button id="save" type="submit" class="btn btn-primary" name="event" value="update">      

                     <i class="icon-save"></i> Save

          </button>

</div>

#{/form}

コントローラー:

public static void editUser(User user) {

User old = User.findById(user.id);            

 /// Right here I need the old record before i edit it. How do i get the old value? That is, i need record with user.instructions = "Old".   I always get the record where user.instructions = "New" even though it is not saved in the database

user.save();                           

}
4

1 に答える 1

0

フォームが送信された後、Play!Framework JPA オブジェクト バインディングがメモリ上のデータを変更するためだと思います (データベース上のデータではなく、永続化されていないため)。

私はこのコードを試してみましたが、うまくいきました.. :) この問題を克服するために、editUserコントローラーのアクションは次のようになります。

public static void editUser(User user) {
   JPA.em().detach(user); // detach framework managed user object
   User old = User.findById(user.id); // get old value from database (get original data)

   // in this scope, "old" variable has same value as in database
   ...

   user = JPA.em().merge(user); // tell framework to manage user object again and reassign variable reference
   user.save(); // persist change to database
}

次の記事が参考になります。

于 2013-04-16T13:49:49.560 に答える