gpt4 book ai didi

java - Hibernate 在尝试检索数据时抛出错误(分离实体)

转载 作者:行者123 更新时间:2023-12-02 02:26:48 25 4
gpt4 key购买 nike

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

class A {
List<B> b;
}

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

我发现 Orika 默认情况下会为集合进行深层复制,所以 entityA = customsClearanceOrderRepository.findById(requestTo.getId());具有实体 B 列表并且被跟踪并包含在持久性上下文中的实体 A 被替换为它们的深拷贝,因此它们有另一个地址,这意味着 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)或类似的东西。

最佳答案

我知道为什么了!

运行时 hibernate someRefersToDb.findAllByOrderByCode();事实上,还调用session.flush()来将 session 数据与数据库同步。由于 Orika 更改了实体的地址,因此它们不再是持久性上下文的一部分,并且同步失败。

关于java - Hibernate 在尝试检索数据时抛出错误(分离实体),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57248279/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com