変更があったプロパティだけを更新するには?

@OriginalStatesというアノテーションを使用すると変更があったプロパティだけを更新できます。

こういう風に使います。エンティティにエンティティと同じ型のフィールドを定義して、そこに@OriginalStatesをつけます。

@Entity
public class Employee {

    @Id
    Integer id;

    String name;

    int age;

    @OriginalStates
    Employee originalStates;
    
    ...
}

Daoから取得して更新します(updateメソッドには@Updateがついている)。

Employee employee = dao.selectById(1);
dao.setName("aaa");
dao.update(employee);

この例だとnameプロパティを変更しているのでnameプロパティに対応するカラムだけがUPDATEのSET句に含まれます(ageは更新されない)。何をしているかというと、検索時にオリジナルの値を@OriginalStatesが注釈されたフィールドにコピーしておいて、更新時に値を比較してUPDATE文を組み立てているわけです。

結構お手軽じゃないでしょうか?

EmployeeさえSerializableにしておけば、更新前の状態を維持したままシリアライズできるはず。不要ならtransientをつければいいですね。


ちなみに、何もプロパティを変更せずにupdateを実行すると何も実行されず、0が返されます。デフォルトではログにはこう出力されます。

2010/01/14 22:58:52 tutorial.dao.EmployeeDaoImpl update
情報: STATE_UNCHANGED
2010/01/14 22:58:52 tutorial.dao.EmployeeDaoImpl update
情報: RETURN 0