10.9. 在两个不同数据库间复制对象

偶尔会用到不重新生成持久化标识(identifier),将持久实例以及其关联的实例持久到不同的数据库中的操作。

  1. //retrieve a cat from one database
  2. Session session1 = factory1.openSession();
  3. Transaction tx1 = session1.beginTransaction();
  4. Cat cat = session1.get(Cat.class, catId);
  5. tx1.commit();
  6. session1.close();
  7. //reconcile with a second database
  8. Session session2 = factory2.openSession();
  9. Transaction tx2 = session2.beginTransaction();
  10. session2.replicate(cat, ReplicationMode.LATEST_VERSION);
  11. tx2.commit();
  12. session2.close();

ReplicationMode决定在和数据库中已存在记录由冲突时,replicate()如何处理。

  • ReplicationMode.IGNORE - 忽略它

  • ReplicationMode.OVERWRITE - 覆盖相同的行

  • ReplicationMode.EXCEPTION - 抛出异常

  • ReplicationMode.LATEST_VERSION - 如果当前的版本较新,则覆盖,否则忽略

这个功能的用途包括使录入的数据在不同数据库中一致,产品升级时升级系统配置信息,回滚non-ACID事务中的修改等等。 (译注,non-ACID,非ACID;ACID,Atomic,Consistent,Isolated and Durable的缩写)