根据hibernate documentation:,有一个关于如何将session.replicate()
和用例用于该功能的小例子:
第11.9节。在两个不同的数据存储之间复制对象:
此功能的用例包括协调输入的数据 不同的数据库实例,升级系统配置 产品升级期间的信息,回滚期间所做的更改 非ACID交易等等。
有人可以帮助我了解它在以下情况下有用吗:
答案 0 :(得分: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
对象已被赋予course1
的ID,但course1
不是由于某些错误而持续存在。因此,您的数据库变得不一致(student1
注册了一个不存在的课程)。要修复不一致的问题,您只需创建一个新的Course
对象,其中包含id
course1
的数据,并使用session.replicate()
保留该对象。
答案 1 :(得分:0)
复制方法对我不起作用,因为在id(非常常见)上使用GeneratedValue优先于您设置的id。这里有一个错误:https://hibernate.atlassian.net/browse/HHH-2716
解决方法是自定义生成器,而是使用合并方法。 https://stackoverflow.com/a/48819098/728602