【发布时间】:2013-07-08 03:02:38
【问题描述】:
我有一个实体,其中包含:
@OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL, mappedBy = "assessment")
@OrderBy(value = "order ASC")
private List<AssessmentPart> assessmentParts = new LinkedList<>();
@OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL, mappedBy = "assessment")
private List<AssessmentText> texts = new LinkedList<>();
如您所见,有两个集合需要立即加载。这不起作用,hibernate 会抛出异常:
Caused by: org.hibernate.loader.MultipleBagFetchException: cannot simultaneously fetch multiple bags
这是因为 Hibernate 无法一次性获取多个集合。但是,如果我将 List 更改为 Set 并将 LinkedList 更改为 HashSet 这部分工作正常,但会出现另一个更烦人的问题。
当我尝试使用以下方式从数据库中获取实体时:
entityManager.find(entityClass, primaryKey);
它失败了:
org.hibernate.AssertionFailure: null identifier
我确定我传递给find 方法的 ID 不为空,我已经调试过并且我确信这一点。它以某种方式在 Hibernate 中消失了。
如果我将集合类型更改为LAZY,一切都会正常运行,但在某些情况下我需要使用EAGER。
有人有解决方法吗?要么我可以有一个集合但防止发生断言错误,要么我可以有一个列表但以某种方式避免多个 fetch bag 错误。
我正在使用:
Hibernate 4.2.2.Final
Tomcat 7
JPA 2.0
JDK 1.7
编辑
我刚刚发现添加@Fetch(FetchMode.SELECT) 解决了这个问题,我可以使用EAGER 类型的多个列表,但是有没有通过不使用Hibernate 特定的注释来解决这个问题?为什么它首先解决了这个问题?
【问题讨论】:
-
有一个答案就是这么说的......你应该接受他的回答......只是说。