何时使用session.replicate()方法

时间:2014-09-20 02:07:50

标签: java hibernate hibernate-session

根据hibernate documentation:,有一个关于如何将session.replicate()和用例用于该功能的小例子:

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

  

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

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

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

2 个答案:

答案 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事务时变得不稳定。说,您的系统中有两个名为CourseStudent的类。在非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