gpt4 book ai didi

java - JPA/EclipseLink 惰性集合未加载

转载 作者:行者123 更新时间:2023-11-30 04:41:32 25 4
gpt4 key购买 nike

我有一个具有以下映射的用户实体:

@OneToMany(mappedBy = "supervisor", fetch = LAZY, cascade = [CascadeType.REFRESH])
List<Group> supervisedGroups = new ArrayList<Group>()

以及具有以下映射的 Group 实体:

@ManyToOne(fetch = LAZY, cascade = [CascadeType.REFRESH])
@JoinColumn(name = "supervisor")
User supervisor

借助存储库,我获取了用户

User user = userRepository.findById(id)

findById 方法由事务包装(该方法由事务管理器建议拦截),并且 JPA 工作单元将持续到请求最后一次(每个 View 的 session )为止。

当我获得用户时,我会执行

user.getSupervisedGroups()

这会返回一个空列表。集合类型是 Eclipselinks 的 IndirectList,即使我调用 size() 方法,它也不会执行任何其他操作。

但是如果我执行

entitymanager.refresh(user)
user.getSupervisedGroups()

然后我的列表中有 2 项...为什么?这是否意味着 EclipseLink 根本不支持集合上的 LAZY 获取?

最佳答案

我的猜测是您已经损坏了共享二级缓存中的对象。

当您插入此对象时,您是否将正确的对象添加到集合中?我的猜测是,当插入一侧而不是添加到多侧时,您有双向 OneToMany/ManyToOne 关系。您必须正确维护对象的关系。

看, http://en.wikibooks.org/wiki/Java_Persistence/Relationships#Object_corruption.2C_one_side_of_the_relationship_is_not_updated_after_updating_the_other_side

关于java - JPA/EclipseLink 惰性集合未加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12165173/

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