Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/347.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_Hibernate_Jpa_Entitymanager_Hibernate Entitymanager - Fatal编程技术网

Java JPA分离和立即合并导致错误

Java JPA分离和立即合并导致错误,java,hibernate,jpa,entitymanager,hibernate-entitymanager,Java,Hibernate,Jpa,Entitymanager,Hibernate Entitymanager,我正在使用JPA(Hibernate作为JPA提供程序)。我有一个删除实体的操作,如果我分离实体并立即合并它,就会抛出一个异常,即 em.find(entity.class, entitiy.getId()) em.detach(entity) em.merge(entity) 将导致错误,而 em.find(entity.class, entitiy.getId()) 将完美地通过。关于分离和合并,我是否缺少一些东西?我没有对实体本身做任何事情,它没有改变,所以合并不应该改变任何东西

我正在使用JPA(Hibernate作为JPA提供程序)。我有一个删除实体的操作,如果我分离实体并立即合并它,就会抛出一个异常,即

em.find(entity.class, entitiy.getId())
em.detach(entity)
em.merge(entity)   
将导致错误,而

em.find(entity.class, entitiy.getId())
将完美地通过。关于分离和合并,我是否缺少一些东西?我没有对实体本身做任何事情,它没有改变,所以合并不应该改变任何东西

如果需要,我可以详细说明我的具体案例

编辑

正如@rmertins指出的,我应该使用merge的返回值,因为merge返回合并实体,而我们用作参数的实体保持分离状态。这项工作:

em.find(entity.class, entitiy.getId())
em.detach(entity)
entity = em.merge(entity)  

对不起,是我的错,太快了

看这里,很好的解释:

这句话很重要:

这意味着在调用EntityManager.merge之后,我们必须使用 从该方法返回的实体引用代替了原始引用 对象传入


因此,线索是,在合并之后,您的实体对象仍然被分离,但从合并中得到的对象副本将再次附加到持久性上下文。

是否仍然使用旧的实体引用而不是合并返回的实体引用

。合并操作查找已加载的实体,但由于找不到实体(因为您已将其分离),因此会从数据库加载实体,并将提供的实体数据复制到数据库的新副本上

如果您这样做:

MyEntity myEntity = em.find(MyEntity.class, myEntity.getId())
em.detach(myEntity);
em.merge(myEntity);
然后,您只需放弃实际合并的实体,因为您没有将myEntity重新分配给合并结果。您应该这样做:

myEntity = em.merge(myEntity);

现在myEntity将引用附加的实体(一级缓存中加载的实体,也称为持久性上下文)。

错误?想给人们一个线索吗?比如异常?是
实体
类还是对象?EntityNotFoundException(在调用em.find()之前,仍然在同一事务中)针对另一个被删除的实体。我说如果需要的话,我会详细说明:)实体是一个对象,Entity.class应该是Entity.class)?您在调用em.merge时收到EntityNotFoundException?那就更奇怪了,就是这样!不敢相信我没有尝试这个,错过了merge()的返回值,谢谢!