您的推理是有效的(一般来说,我们可以争论age
字段的具体示例),但不幸的是没有直接的解决方案。实际上,Hibernate的概念是fetch profiles,但它目前非常有限(只能使用连接样式获取配置文件覆盖默认获取计划/策略)。
因此,您的问题可能的解决方法如下。
1)移动age
到一个单独的实体和Person
实体与其关联有懒惰一对一的关系:
@Entity
class PersonAge {
private Integer age;
}
@Entity
class Person {
@OneToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY, orphanRemoval = true, optional = false)
@JoinColumn(name = "PERSON_AGE_ID")
private PersonAge personAge;
public Integer getAge() {
return personAge.getAge();
}
public void setAge(Integer age) {
personAge.setAge(age);
}
}
2)定义它覆盖默认的一个取配置文件:
@FetchProfile(name = "person-with-age", fetchOverrides = {
@FetchProfile.FetchOverride(entity = Person.class, association = "personAge", mode = FetchMode.JOIN)
})
3)启用此配置文件为应用中的每个会话:
session.enableFetchProfile("person-with-age");
根据您使用的框架,应该有一个简单的钩子/拦截器,您可以使用该钩子/拦截器为启动的每个会话(事务)启用配置文件。例如,Spring中的方法可能是覆盖正在使用的事务管理器的AbstractPlatformTransactionManager.doBegin。
这样personAge
将被急切地加载到应用程序的所有会话中,除非显式禁用获取配置文件。
4)禁用在会话中使用所需的条件查询获取配置文件:
session.disableFetchProfile("person-with-age");
这样的默认获取计划/使用策略(在实体映射指定),其是PersonAge
的延迟加载。
我认为这是不可能的,但相反的是,让它懒惰触发它在需要时初始化。 –
在你的'Person'实体中添加'age'注解'@Basic(fetch = FetchType.LAZY)'。至少给一个镜头。 –
@PawełGłowacz我知道这种风格,我不喜欢它。它应该是标准的一部分,而不是实体的实施。 –