10.9. 異なる二つのデータストア間でのオブジェクトのレプリケーション

永続インスタンスのグラフを別のデータストアに永続化する場合に、識別子の値を再生成せずにすむと便利な場合があります。
//retrieve a cat from one database
Session session1 = factory1.openSession();
Transaction tx1 = session1.beginTransaction();
Cat cat = (Cat) session1.get(Cat.class, catId);
tx1.commit();
session1.close();

//reconcile with a second database
Session session2 = factory2.openSession();
Transaction tx2 = session2.beginTransaction();
session2.replicate(cat, ReplicationMode.LATEST_VERSION);
tx2.commit();
session2.close();
データベースに既存の行がある場合、replicate() が衝突をどのように扱うかを ReplicationMode で指定します。
  • ReplicationMode.IGNORE:同じ識別子を持つ行がデータベースに存在するなら、そのオブジェクトを無視します。
  • ReplicationMode.OVERWRITE:同じ識別子を持つ既存の行をすべて上書きします。
  • ReplicationMode.EXCEPTION:同じ識別子を持つ行がデータベースに存在する場合、例外を投げます。
  • ReplicationMode.LATEST_VERSION:行に保存されているバージョン番号が、引数のオブジェクトのバージョン番号より古い場合、その行を上書きします。
次のようなケースで、この機能を使用します。異なるデータベースインスタンスに入れられたデータの同期、製品更新時におけるシステム設定情報の更新、非 ACID トランザクションのなかで加えられた変更のロールバックなどです。