根据hibernate文档:,有一个关于如何为该特性使用session.replicate()和用例的小例子如下:
第11.9节。在两个不同的数据存储之间复制对象:
此功能的用途包括调节输入到不同数据库实例中的数据、在产品升级期间升级系统配置信息、回滚在非酸性事务处理期间所做的更改等。
有谁能帮我理解一下在以下情况下是如何帮助我的吗?
发布于 2014-09-20 07:11:43
这个特性不是您想要一般使用的。当您想使用以前生成的标识符持久化对象时,可以使用replicate()。
示例在系统升级中的应用
假设您需要用一些新的特性来升级您的系统,并删除一些旧的特性。现在,您希望将现有数据库迁移到新的数据库,以方便您的新需求。session.replicate()可以使用如下所示:
myNewObject.setId(myOldObject.getId());
myNewObject.setExistingProperty(myOldObject.getExistingProperty());
myNewObject.setNewProperty("my new property");
session.replicate(myNewObject, ReplicationMode.EXCEPTION);示例用于回滚非酸性事务中所做的更改
假设您的数据库在执行一些非酸性事务时变得不稳定。比方说,您的系统中有两个类名为Course和Student。在非ACID事务期间,假设student1对象与course1一起持久化,其中student1对象已经为course1提供了一个id,但是由于某些错误,course1没有被持久保存。由于这个原因,您的数据库变得不一致(student1注册参加一个不存在的课程)。要修复不一致性,只需使用数据和id of course1创建一个新的course1对象,并使用session.replicate()将其持久化。
发布于 2018-02-16 02:07:36
复制方法对我无效,因为在id上使用GeneratedValue (这是非常常见的)优先于您设置的id。这里有一个bug:https://hibernate.atlassian.net/browse/HHH-2716
解决方法是一个自定义生成器,而不是使用合并方法。https://stackoverflow.com/a/48819098/728602
https://stackoverflow.com/questions/25944516
复制相似问题