Hibernate在试图检索数据时会引发错误(分离实体)



尝试更新实体时,我首先从数据库中检索它,然后我使用orika mapper将其映射到fromartend上。然后,我尝试使用" JParepository"和findAllByOrderByCode方法检索与该实体无关的一些数据。当我遇到一个奇怪的错误时,说:"发生了一个意外的例外:传递的独立实体持续存在:"。而且此错误不是指实体的基本字段,而是指该实体集合的对象。总结:我有一个实体A,其双向映射到许多人到实体b:

class A {
List<B> b;
}

然后,我想用frontend的对象更新整个a,我使用orika mapper映射了一个对象。在尝试获取一些数据时,我有一个错误。

我发现Orika默认是为entityA = customsClearanceOrderRepository.findById(requestTo.getId());制作的深层副本Entitya具有Entitya列表,并在持久性上下文中进行了跟踪并包含的Entitya被其深副本所取代,因此它们具有另一个地址,这意味着他们不再被Hibernate跟踪。因此,我尝试自己映射这些收藏,只是更新字段而不是创建一个新对象,然后问题就消失了。

一切都会好起来的,但是当我删除此行List<SthTo> all = someRefersToDb.findAllByOrderByCode(); // error appears here时那么问题也不存在,即使我再次使用Orika,这使得这一深度副本。而且我知道它的工作正常,因为" saveandflush"实际上是在更新时使EntityManager.merge(entity)的问题,而另一个实体地址的问题并不是问题(因为它将其复制到持久性上下文中,它将其复制到持久性上下文中(。

(。 。
entityA = entityARepository.findById(requestTo.getId());
entityAMapper.map(requestTo, entityA);
List<SthTo> all = someRefersToDb.findAllByOrderByCode(); // error appears here
EntityA entityASaved = entityARepository.saveAndFlush(entityA);

所以我想知道这里发生了什么:someRefersToDb.findAllByOrderByCode();是否有某种检查实体的状态?默认情况下,一切都是如此,我的意思是没有像这样的魔法@Transactional(propagation = Propagation.REQUIRES_NEW)或STH。

我知道为什么!

在运行someRefersToDb.findAllByOrderByCode();时休眠实际上,呼叫session.flush(),用于将会话数据与数据库同步。而且,由于Orika更改了实体的地址,其不再是持久性上下文的一部分,并且同步失败了。

相关内容

最新更新