【发布时间】: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<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();
是否有某种检查实体A的状态?
一切都是默认的,我的意思是没有神奇的@Transactional(propagation = Propagation.REQUIRES_NEW)或类似的东西。
【问题讨论】:
标签: java hibernate mapping orika