【发布时间】:2025-12-23 21:15:11
【问题描述】:
我在使用 Criteria 查找属于某个实体的所有对象时遇到问题。我的模型如下(仅显示相关代码):
@Entity...
Class A {
@ManyToOne(fetch = FetchType.EAGER)
@Fetch(FetchMode.JOIN)
@JoinColumn(name = "ide_b", referencedColumnName = "ide_b", nullable = false)
private B b;
}
@Entity...
class B {
@ManyToOne(fetch = FetchType.EAGER)
@Fetch(FetchMode.JOIN)
@JoinColumn(name = "ide_c", referencedColumnName = "ide_c", nullable = false)
private C c;
}
@Entity...
class C {
...
}
我的 Criteria 查询就是这么简单(实际上,会有一些过滤器,但它们没有被使用):
Criteria criteria = getSession().createCriteria(A.class);
criteria.list(); // MY SYSTEM STAYS HERE FOREVER WHEN RUNNING AGAINST A REAL DATABASE
有人知道这个问题吗?系统只是永远停留在“criteria.list()”这一行,永远不会返回。
我已经测试了它直接在数据库上生成的 SQL,它运行良好。
我已经用代码测试了这个查询,代码只涉及到 A 类引用 B 和 A 类引用 C(直接)。他们都工作。关联中的第三级似乎引起了问题...注意:我的 Hibernate 版本是旧版本,例如 3.0.0
【问题讨论】:
-
删除
@Fetch(和@JoinColumn)注释怎么样? -
我无法删除
@JoinColumn,因为我必须为 Hibernate 提供要映射的列的名称。尝试从关系 B -> C 中删除@Fetch,但没有成功。 -
fetch eager 非常激进,您将收到 X * Y * Z 元素,其中 X 和 Y 复制了任意多次。 Eager 仅适用于具有少量行的 1->n 关系,否则有利于 Lazy getters。 Lazy 会发送更多查询,但总体而言会更轻松。
-
我尝试将关系设置为 Lazy,但也没有成功。此外,包含 B 和 C 记录的两个表都非常小(B 有 8 行,C 有 3 行)。 A 有 14018 行。
-
Lazy 到底有什么不适合的?因为当你知道如何使用 Lazy 时,它就会起作用。另外:14018 * 8 * 3 = 336432。要处理的记录很多。
标签: java hibernate criteria relationships