1

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

@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 工作单元的持续时间与请求持续时间一样长(每个视图的会话)。

当我得到用户时,我会做一个

user.getSupervisedGroups()

这会返回一个空列表。集合类型是 Eclipselinks 的 IndirectList,即使我调用 size() 方法,它也无济于事。

但是如果我执行

entitymanager.refresh(user)
user.getSupervisedGroups()

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

4

3 回答 3

2

我的猜测是您损坏了共享 L2 缓存中的对象。

插入此对象时,是否将正确的对象添加到集合中?我的猜测是你有一个双向的 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

于 2012-08-29T12:58:00.610 回答
1

詹姆斯的回答可能是问题的根源。另一种解决方案是禁用 EclipseLinks L2 缓存:

持久性单元属性:

<property name="eclipselink.cache.shared.default" value="false"/>

或 JPA 2.0 持久性单元元素:

<shared-cache-mode>NONE</shared-cache-mode>

来源:https ://wiki.eclipse.org/EclipseLink/FAQ/How_to_disable_the_shared_cache%3F

于 2017-12-06T11:07:32.753 回答
0

将您的 fetch 属性fetch = LAZY从两个实体更改为 fetch=FetchType.LAZY 喜欢这样

  @OneToMany(mappedBy = "supervisor", fetch=FetchType.LAZY, cascade = CascadeType.REFRESH)
于 2012-08-29T05:23:11.877 回答