我想在我的存储库层中有一个选项来渴望加载实体,所以我尝试添加一种方法来渴望加载具有所有关系的问题实体,但是它会抛出MultipleBagFetchException。我怎样才能解决这个问题?我正在使用Hibernate
4.16。
@NamedQuery(name = Question.FIND_BY_ID_EAGER, query = "SELECT q FROM Question q LEFT JOIN FETCH q.answers LEFT JOIN FETCH q.categories LEFT JOIN FETCH q.feedback LEFT JOIN FETCH q.participant WHERE q.id = :id"),
我如何获得一个最初是延迟加载的问题对象,以期渴望加载所有关系?
在Hibernate和通常的ORM中,这是一个相当棘手的问题。
发生的情况是,许多(提取)连接导致创建了相当大的笛卡尔积。也就是说,其他任何联接都会在结果中出现新的列和新的行,从而导致(相当大的)“正方形”结果。
Hibernate需要从该表中提取图形,但是它不足以将正确的列与正确的实体进行匹配。
例如
假设我们有结果
A B C
A B D
需要成为:
A
|
B
/\
C D
Hibernate可以从主键和一些编码魔术中扣除图形必须是的图形,但是实际上它需要显式的帮助才能实现。
一种实现方法是通过在关系上指定特定于Hibernate @IndexColumn
或JPA的标准@OrderColumn
。
例如
@Entity
public class Question {
@ManyToMany
@JoinTable(
name = "question_to_answer",
joinColumns = @JoinColumn(name = "question_id"),
inverseJoinColumns = @JoinColumn(name = "answer_id")
)
@IndexColumn(name = "answer_order")
private List<Answer> answers;
// ...
}
在此示例中,我使用的是带有额外column的联接表answer_order
。通过此列(每个Question /
Answer关系具有唯一的序号),Hibernate可以区分结果表中的条目并创建所需的对象图。
顺便说一句,如果它涉及多个实体,那么使用如此多的热切连接可能会导致结果集比您根据所涉及的实体数所想的要大得多。
进一步阅读:
问题内容: 在tomcat 7中部署应用程序时,我从此pom.xml运行mvn tomcat7:run时遇到此错误。在我的依赖项中,我想问题可能是由于相依软件包的混合版本引起的。 这是../../pom.xml: 问题答案: 此类是在4.xx版本中添加的,您将不会在Hibernate 3中找到它 可能是您的Maven依赖关系树中有2个版本。 你需要: 跑 检查您有多少个版本以及哪些其他3rd oa
泛型方法 在控制器中获取列表 测试 测试 结果[java.lang.ClassCastException] 为什么该类强制执行异常,因为criteria.SetProjection(pl)返回条件,然后返回相同列表的条件。 如何对此进行动态控制? 更新我!
问题内容: 我有这种方法: 映射: Person.hbm.xml Cars.hbm.xml 此方法适用于单个线程,并且在多个线程上,给我一个错误: AOP交易: 注意:当我在更新后添加Thread.sleep(5000)时,就可以了。 但是这种解决方案并不干净。 问题答案: 我有汽车->(1-n)个地方。而且我在表位置(id_car)有一个外键。此外键没有索引。当我向该外键添加索引时,我的问题已解
我在Spring/Hibernate网络应用程序上有以下代码: 实体: 听众: 此代码在实体上每次更新或持久化后调用。问题在于,当为负数量引发异常时,hibernate将上的
我在集成Hibernate和EHCache时遇到了一些问题。我使用的是Hibernate 3.2.7 GA、Hibernate Annotation 3.2.1 GA、hibernate-commons-annotations 3.2.0.final、net.sf.ehcache 2.2.0和Spring Version3.2.4.release。当我运行测试用例时,我得到了net.sf.ehca
问题内容: 因此,我有一个表,已将其定义为hibernate状态,如下所示: 当我尝试针对此表编写一个简单查询时: 我收到以下错误: 为什么不能hibernate找出类上的dbgroupid? 问题答案: 可能是因为您的getter(和setter)没有遵循javabeans约定。它应该是: 我的建议是-命名字段,然后使用IDE生成设置器和获取器。它将遵循惯例。(另一件事,这是一个偏好问题,但我认