java - 如何保存复制实体JPA?
问题描述
我有一个配置文件实体,我使用 SerializationUtils 制作了这个实体的副本,记下一些值并希望将其作为新记录保存到数据库中,但由于某种原因,我正在更新我制作的原始记录复制,我做错了什么?
Profile profile = profileRepository.findByProfileId(profileId).orElseThrow(() -> {
throw new NullPointerException(String.format("profile with id=%s not found", profileId.toString()));
});
Profile newProfile = SerializationUtils.clone(profile);
entityManager.detach(profile);
newProfile.setId(null);
newProfile.setProfileId(UUID.randomUUID());
newProfile.setSnils(profileWithValidationSuccessBySnils.getSnils());
entityManager.persist(newProfile);
解决方案
您使用 SerializationUtils 所做的很可能会导致您的副本与原始对象具有相同的 Hibernate/JPA 代理,从而导致 Hibernate 将其视为原始对象(iow,与您刚刚完成“Profile newProfile = profile ;"
因为我不知道您的 SerializationUtils 实际做了什么以及它是如何实现的,所以很难说,但如果我写它,我会在其实现中考虑 Hibernate 代理。
最好的方法是从头开始创建一个新实体,并将原始实体中的数据字段减去@Id 字段提供给它。
例如,您可以使用复制构造函数来执行此操作(我知道,这在 Java 中是一个肮脏的词)。
这样,您就可以保证拥有一个全新的实体,该实体未链接到持久存储中的任何内容,因此应始终创建新记录。
对于我们的一个项目,我们为这种情况编写了我们所谓的“DeHibernator”(更具体地说,是从需要传输到内存受限设备的对象中剥离 Hibernate 代理,而我们无法加载 Hibernate 只是为了能够传输代理并让它们在这些设备上工作)。
推荐阅读
- reactjs - material-ui 自动完成中的自定义 renderInput
- java - 事件/动作机制的设计问题,Java 泛型
- r - 用于R中数据框列表的自定义函数的哪些参数
- android - 如何将信息传递到 ViewPager 选项卡中的片段?
- sql-server - SQL Server 将数据类型 varchar 转换为浮点数时出错
- reactjs - 将泛型传递给功能组件 React Typescript
- amazon-web-services - 在 AWS SageMaker GroundTruth 中如何计算置信度分数?
- python - 找到两组交替出现重叠的字符串之间的字符串
- asp.net-core - 如何仅删除使用 Javascript 从网页中删除的图像
- java - 我收到“线程中的异常“AWT-EventQueue-0”java.lang.NullPointerException”错误