在Hibernate映射中,默认的获取类型是什么?
经过我的探索,我得到的信息如下:
- 对于一对一关系,它是立即加载(eager)。
- 对于一对多关系,它是延迟加载(lazy)。
但在Eclipse中测试后,所有都是立即加载。
这是否取决于我使用JPA还是Hibernate?
这取决于您是使用JPA还是Hibernate。
根据JPA 2.0规范,默认值为:
OneToMany: LAZY
ManyToOne: EAGER
ManyToMany: LAZY
OneToOne: EAGER
而在Hibernate中,一切都是“懒”的
更新:
Hibernate的最新版本与上述JPA默认值相符。
我知道问题提出时回答是正确的 - 但由于人们(比如我现在)仍然在想为什么他们的 WildFly 10 表现不同,我想为当前的 Hibernate 5.x 版本提供更新:
在 Hibernate 5.2 用户指南 的第11.2章节中指出:
Hibernate 建议静态标记所有关联项为 lazy,并对渴望使用动态获取策略。不幸的是,这与 JPA 规范相悖,规定了默认情况下应急切地获取所有一对一和多对一的关联项。作为 JPA 提供程序,Hibernate 遵守该默认设置。
因此,Hibernate 的行为与上面 Ashish Agarwal 关于 JPA 的说法相似:
OneToMany: LAZY
ManyToOne: EAGER
ManyToMany: LAZY
OneToOne: EAGER
请参阅JPA 2.1规范。
因此,无论您声明了什么类型的关系,Hibernate始终将使用惰性获取策略来加载任何对象。它将在一对一或多对一关系中使用惰性代理(应该未初始化但不为null),并使用null集合,在您尝试访问它时填充它们的值。默认情况下,Hibernate对集合使用惰性选择获取,并对单值关联使用惰性代理获取。这些默认值对于大多数应用程序中的大多数关联都有意义。
fetchType.EAGER
,否则Hibernate只会在您尝试访问对象时尝试填充这些对象的值。对于单值关联,即一对一和多对一:
默认的Lazy=proxy
代理懒加载:这意味着一个与您关联实体的代理对象被加载。这意味着仅为关联实体的代理对象加载连接两个实体的id。
例如:A和B是具有多对一关联的两个实体。也就是说,每个B可能有多个A。每个A对象都将包含一个B的引用。
`
public class A{
int aid;
//some other A parameters;
B b;
}
public class B{
int bid;
//some other B parameters;
}