【问题标题】:Hibernate throws error (Detached entity) while trying to retrieve dataHibernate 在尝试检索数据时抛出错误(分离的实体)
【发布时间】:2019-12-06 11:10:31
【问题描述】:

在尝试更新实体时,我首先从数据库中检索它,然后使用 Orika Mapper 从前端映射 TO。 然后我尝试使用'JpaRepository'和findAllByOrderByCode方法检索一些与该实体无关的数据。虽然这个操作我得到一个奇怪的错误说:“发生意外异常:分离实体传递给坚持:”。 而且这个错误不是指实体中的基本字段,而是指来自该实体的集合中的对象。 总结: 我有实体 A,它具有一对多到实体 B 的双向映射:

class A {
List<B> b;
}

然后我想用我使用 Orika Mapper 映射的前端对象更新整个 A。 在尝试获取一些数据时,我遇到了错误。

我发现 Orika 默认情况下会为集合制作深拷贝,所以 entityA = customsClearanceOrderRepository.findById(requestTo.getId()); 具有entitiesB 列表并且被跟踪并包含在持久性上下文中的entityA 被替换为它们的深层副本,因此它们具有另一个地址,这意味着它们不再被Hibernate 跟踪。 所以我尝试自己映射这些集合,只更新字段而不创建新对象,然后问题就消失了。

一切都会好起来的,但是当我删除这一行时 List&lt;SthTo&gt; 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(); 是否有某种检查实体A的状态? 一切都是默认的,我的意思是没有神奇的@Transactional(propagation = Propagation.REQUIRES_NEW)或类似的东西。

【问题讨论】:

    标签: java hibernate mapping orika


    【解决方案1】:

    我知道为什么!

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-11-21
      • 1970-01-01
      • 2020-04-04
      • 2014-09-05
      • 1970-01-01
      • 2017-01-12
      • 1970-01-01
      • 2016-04-01
      相关资源
      最近更新 更多