2012-03-27 13 views
0

私はpersonテーブルとPerson.javaをテーブルにマッピングしています。私はPersonレコードの詳細を変更するための編集UIを持っています。編集ページでは、ユーザーは通常、一度に1つまたは2つのフィールドを変更します。私はAJAXを使用して更新呼び出しを送信し、変更されたフィールドのみを送信したい。現在、オブジェクト全体を戻しています。変更されたフィールドのみの更新テーブル

問題は、変更されたフィールドのみのデータベースの更新方法に関するバックエンドです。

UIレイヤーは、変更されたフィールドのみを持つPersonオブジェクトを作成し、残りのフィールドは初期化されません。その後、オブジェクトは永続性のためにDAOに渡されます。 DAOはどのようなフィールドが変更されているか知っていますか?どのフィールドが初期化されていないか、あるいは意図的に更新のためにnullに設定されています。現在、オブジェクト全体が来るので、すべての列を更新します。

+1

これは岩場のように感じられます。なぜDB内の特定のフィールドを更新するだけですか?ユーザーがオブジェクト全体を表すフォームにデータをコミットしている場合は、オブジェクト全体を更新する必要があります。フィールド単位で更新すると、並行処理の競合をどのように検出して処理しますか? (たとえば、2人のユーザーが同じPersonの異なるフィールドをほぼ同時に更新します。各ユーザーの観点からは、レコード全体が正しいですが、この方法でマージすると正しくありません。 – David

+0

レコードにはタイムスタンプがあるため並行性 –

+0

レコードのどのフィールドでタイムスタンプが更新されましたか?結局のところ、このデザインでは、ユーザーはフィールドの一部だけを更新し、一部のフィールドは更新しませんでした。したがって、監査証跡の観点からは、ユーザーが実際に更新しなかったデータをユーザーが更新したことを記録します。 – David

答えて

0

私は通常、データベースからすべてのフィールドを持つオブジェクトを取得します。それから、私が望むフィールドを更新してからDAOに送り返します。 DAOは何があってもオブジェクト全体を更新します。このようにして、DAOはどちらが変更されたかは気にしません。 いくつかの特殊なケースがありますが、別のDAOメソッドを追加したい場合もあります。

1

永続性のためにORM(Hibernate)を使用している場合、hibernate.mergeを使用して選択的更新を行うことができます。

JDBCへのアプローチ: ユーザーが編集できる初期値でUIを塗りつぶすために使用されるセッション内のオブジェクトを保持します。 ユーザーが変更をサブミットするときは、送信された値をセッション中のオブジェクトと比較し、フィールド名と新しい値を含むマップをマップに追加します。このマップを使用して、更新クエリを動的に作成します。

関連する問題