1

根据休眠文档:,有一个关于如何使用session.replicate()该功能和用例的小示例:

第 11.9 节。在两个不同的数据存储之间复制对象:

此功能的用例包括协调输入不同数据库实例的数据、在产品升级期间升级系统配置信息、回滚在非 ACID 事务期间所做的更改等等。

有人可以帮助我了解它在以下情况下的帮助:

  • 在产品升级期间升级系统配置信息
  • 回滚在非 ACID 事务期间所做的更改等等。
4

2 回答 2

3

此功能不是您通常想要使用的功能。当您想使用之前生成的标识符来持久化您的对象时,您可以使用replicate().

系统升级的示例用法

假设您需要使用一些新功能升级您的系统并删除一些旧功能。现在您想将现有数据库迁移到新数据库,从而满足您的新需求。session.replicate()可以像下面这样有用:

 myNewObject.setId(myOldObject.getId());
 myNewObject.setExistingProperty(myOldObject.getExistingProperty());
 myNewObject.setNewProperty("my new property");
 session.replicate(myNewObject, ReplicationMode.EXCEPTION);

回滚非 ACID 事务中所做更改的示例用法

假设您的数据库在执行一些非 ACID 事务时变得不稳定。假设,您的系统中有两个名为Course和的类Student。在非 ACID 事务期间,说student1对象被持久化course1,其中student1对象已经被赋予了 id course1,但course1由于某些错误而没有持久化。因此,您的数据库变得不一致(student1注册了不存在的课程)。要修复您的不一致,您只需Course使用数据创建一个新对象并id使用.course1session.replicate()

于 2014-09-20T07:11:43.447 回答
0

复制方法对我不起作用,因为在 id 上使用 GeneratedValue(这很常见)优先于您设置的 id。这里有一个错误:https ://hibernate.atlassian.net/browse/HHH-2716

解决方法是使用自定义生成器并改用合并方法。https://stackoverflow.com/a/48819098/728602

于 2018-02-16T02:07:36.263 回答