根据休眠文档:,有一个关于如何使用session.replicate()
该功能和用例的小示例:
第 11.9 节。在两个不同的数据存储之间复制对象:
此功能的用例包括协调输入不同数据库实例的数据、在产品升级期间升级系统配置信息、回滚在非 ACID 事务期间所做的更改等等。
有人可以帮助我了解它在以下情况下的帮助:
- 在产品升级期间升级系统配置信息
- 回滚在非 ACID 事务期间所做的更改等等。
根据休眠文档:,有一个关于如何使用session.replicate()
该功能和用例的小示例:
第 11.9 节。在两个不同的数据存储之间复制对象:
此功能的用例包括协调输入不同数据库实例的数据、在产品升级期间升级系统配置信息、回滚在非 ACID 事务期间所做的更改等等。
有人可以帮助我了解它在以下情况下的帮助:
此功能不是您通常想要使用的功能。当您想使用之前生成的标识符来持久化您的对象时,您可以使用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
使用.course1
session.replicate()
复制方法对我不起作用,因为在 id 上使用 GeneratedValue(这很常见)优先于您设置的 id。这里有一个错误:https ://hibernate.atlassian.net/browse/HHH-2716
解决方法是使用自定义生成器并改用合并方法。https://stackoverflow.com/a/48819098/728602