Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何保存副本实体JPA?_Java_Jpa_Spring Data Jpa - Fatal编程技术网

Java 如何保存副本实体JPA?

Java 如何保存副本实体JPA?,java,jpa,spring-data-jpa,Java,Jpa,Spring Data Jpa,我有一个概要文件的实体,我使用SerializationUtils复制了这个实体,并记录了一些值​​想将新记录保存到数据库中,但出于某种原因,我正在更新原始记录,从中复制副本,我做错了什么 Profile profile = profileRepository.findByProfileId(profileId).orElseThrow(() -> { throw new NullPointerException(String.for

我有一个概要文件的实体,我使用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将其视为原始对象(注意,与您刚才所做的“Profile newProfile=Profile;”没有什么不同

由于我不知道SerializationUtils的实际功能以及它是如何实现的,所以很难说,但如果我要编写它,我会在实现时考虑Hibernate代理

最好的方法是从头创建一个新实体,并将原始实体减去@Id字段后的数据字段提供给它

例如,您可以使用复制构造函数来实现这一点(我知道,它在Java中是一个肮脏的词)

这样就保证了您有一个完全新的实体,该实体没有链接到持久性存储中的任何内容,因此应该始终创建一个新记录


在我们的一个项目中,我们为这样的情况编写了我们称之为“DeHibernator”(更具体地说,是为了将Hibernate代理从需要传输到内存受限设备的对象中剥离出来,在这些设备中,我们无法加载Hibernate,只是为了能够传输代理并让它们在这些设备上工作).

以前引用分离实体的实体将继续引用它。根据javadocs,因此可能是更早的
detach
,也可能是
detach
newProfile
?好的。如何创建实体对象的副本并将其保存为数据库中的新记录?可能您正在做的很好,只需尽早分离即可esn不起作用。原因:org.hibernate.persistentObject异常:传递给persist的分离实体:
newProfile.setId(null);
实际起作用吗?关于DeHibernator:这与调用hibernate.unproxy()不一样吗?@Coloco考虑到应用程序的结构,它需要做的不仅仅是这些,对于要处理的每个businessobject,可能有不止一个Hibernate实体,Hibernate不可能总是知道这些实体是链接在一起的。Hibernate的古老应用程序设计在数据库创建多年后,在许多地方都没有统治关键关系和类似的事情。