私はSpring 4とHibernate 4を使用しています。他の多くの人が抱えているように見える問題があります。Spring フォームでエンティティ全体ではなく、特定のプロパティのみを編集したい。
デフォルトでは、永続化されたエンティティをロードすると、そのプロパティのいくつかを編集用のフォームに表示し、コントローラーに投稿して保存します...フォームに含まれていないプロパティ値はすべて失われます。なぜこれが起こるのかは理解していますし、いくつかの解決策が浮かんでいることも知っています。
1)保存時に、データベースからエンティティをロードし、モデルから必要なプロパティのみをコピーして保存します。
2) フォームが開始したら、エンティティをロードし、 @SessionAttributes 機能を使用してリクエスト間のセッションに格納します。
しかし、私はこれらのどれも好きではありません。多分私は何かが欠けているかもしれませんが、解決策はかなり単純に思えます。どこかで、デフォルトの Spring Web バインダーが、フォーム プロパティをコピーするエンティティのインスタンスを作成しています。それをオーバーライドし、ID を使用して永続化されたエンティティを DB からロードすることができれば、Spring のバインディングでそれをターゲット エンティティとして使用できます (フォームで送信されたプロパティのみをコピーし、他のプロパティはそのままにしておきます)。私の問題を解決します。
カスタム WebDataBinder クラスをどこでどのように使用できるかを探していました。方法がわかりません....そして、それが私が見るべき場所であるかどうかさえわかりません。
助言がありますか?
ありがとう!!
編集:
私の問題をよりよく説明するために、架空の例を挙げます。50 個のプロパティを持つエンティティ クラス Customer があるとします。連絡先情報のみを更新するためのフォームがあります。50物件中、たったの5物件です。
通り
市
州
郵便
番号
これをSpringフォームで行う場合、フォームが送信されて保存されると、Springは新しい「空白」エンティティを作成し、フォームからの値を入力してコントローラーに渡します...これが保存されます。問題は、firstName、lastName、customerType などの他のプロパティがフォームに含まれていなかったため、Spring がそれらをそのままにして null のままにすることです。Spring が提供するエンティティを使用してエンティティを更新するように Hibernate に指示すると、Hibernate は、firstName、lastName などを Bean で提供する値であるため、null にする必要があると考えます。私がそれらのいくつかを変更しただけだとは知りません。
それでどうなるの?50 のプロパティ値のうち 45 が吹き飛ばされます。
以下のコメントで、Sp00m は機能する解決策を提案しました... 非表示フィールドに他のすべてのプロパティを含めます。しかし、さまざまな理由から、その解決策は私にとって大きな頭痛の種です。
(新しい/空白のエンティティを作成する代わりに) Spring にデータベースからエンティティをロードさせ、フォームで送信されたフィールドのみを入力することができた場合。それが私の問題を解決すると信じています。
同様の議論 (ただし、隠しフィールド ソリューションを使用) は、ここで見つけることができます。