2012-04-21 4 views
2

私はプロジェクトをビルドするために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つでなければならないと確信しています)私は非常に明白な何かが欠けている場合、私は春と休止状態に非常に新しいです、私に知らせてください。

ありがとうございました。

答えて

1

"dynamic-update"を使用すると、変更されたフィールドのみが更新されます。 @org.hibernate.annotations.Entityは、エンティティに動的更新をマークすることができます。

@Entity 
@org.hibernate.annotations.Entity(
     selectBeforeUpdate = true, 
     dynamicInsert = true, dynamicUpdate = true) 
public class User { ... } 
+0

ご返信ありがとうございます。私はあなたの方法を試しましたが、私が期待したことをしていないようです。私の理解では、動的更新とは、変更されたフィールドだけがデータベース内で更新されることを意味します。しかし、更新後に値を再バインドすると、フォームに存在しないため、実際にはname/passwordの値が失われました。あなたはそれに対処する方法について考えていますか?ありがとう。 – pippo

+1

ユーザの一意の識別子が利用可能である限り、HTMLフォーム内にすべてのフィールドを持つ必要はありません。ユーザーがフォームを送信すると、データベースから一意のIDで識別されるユーザーオブジェクトをフェッチし、フォームの値でフィールドを更新します。ユーザ識別子は、データベースID(サロゲートキー)のユーザ名(自然キー)であってもよく、HTTPセッション内に格納されてもよい。また、(分離された)ユーザーオブジェクト全体をHttpSession内に格納し、フォーム送信時にHibernate Sessionに再接続することも可能です。原則は上記のものに非常に似ています。 – andih