私はプロジェクトをビルドするためにSpring 3とHibernate 4を使用しています。部分的に更新されたオブジェクトを休止状態に維持する方法
私の質問は、たとえば、UserオブジェクトにはID、名前、パスワード、学校、住所の5つのフィールドがあります。私は自分の学校や住所を更新/編集する権利しかユーザーに与えません。ユーザーが最初にGET経由で編集ページにアクセスすると、そのフィールドにユーザーの既存の情報を入力します。
送信ボタンをクリックすると、データベースの対応する更新されたフィールドを休止状態で変更します。
Controller.java
@RequestMapping(value="/edit/{userId}", method="RequestMethod.GET")
public String toEdit(Model model,@PathVariable int userId){
User user = userService.get(userId);
model.addAttribute("command",user);
return "/edit";
}
@RequestMapping(value="/save", method="RequestMethod.POST")
public String toSave(Model model){
//how to implement this?
}
たedit.jsp
<form:form action="/save" method="POST">
<form:input path="school"/>
<form:input path="address"/>
<input type="submit"/>
</form:form>
私の考えた場合、私はそのようにされたedit.jspページに隠されたフィールドのように更新されていないこれらのフィールドを置くことができるということです(フォームが送信されたときに)Userオブジェクトが再バインドされても、ユーザーのID、名前、およびパスワード情報を取得できます。
私のアプローチの落とし穴は明らかです。まず、隠しフィールドとしてのパスワードは決して行く方法ではありません。次に、edit.jspページに不要な情報を追加します。
私はedit.jspにユーザーIDを隠しフィールドとして入れることができ、フォームが送信されると、User user = userService.get(command.id)
を使用して対応するユーザーオブジェクトを取得し、フィールドを設定することができます(例:学校または住所)をuser.setSchool(command.getSchool())
のようなもので新しく入力したものに置き換えます。これらのすべての後、私はユーザーオブジェクトを更新することができます。このアプローチはちょっと面倒です。更新するフィールドがたくさんある場合、多くのコードが作成されるためです。
これを行うより良い方法はありますか? (私は確かに1つでなければならないと確信しています)私は非常に明白な何かが欠けている場合、私は春と休止状態に非常に新しいです、私に知らせてください。
ありがとうございました。
ご返信ありがとうございます。私はあなたの方法を試しましたが、私が期待したことをしていないようです。私の理解では、動的更新とは、変更されたフィールドだけがデータベース内で更新されることを意味します。しかし、更新後に値を再バインドすると、フォームに存在しないため、実際にはname/passwordの値が失われました。あなたはそれに対処する方法について考えていますか?ありがとう。 – pippo
ユーザの一意の識別子が利用可能である限り、HTMLフォーム内にすべてのフィールドを持つ必要はありません。ユーザーがフォームを送信すると、データベースから一意のIDで識別されるユーザーオブジェクトをフェッチし、フォームの値でフィールドを更新します。ユーザ識別子は、データベースID(サロゲートキー)のユーザ名(自然キー)であってもよく、HTTPセッション内に格納されてもよい。また、(分離された)ユーザーオブジェクト全体をHttpSession内に格納し、フォーム送信時にHibernate Sessionに再接続することも可能です。原則は上記のものに非常に似ています。 – andih