変更があったプロパティだけを更新するには?
@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