1. 数据获取的概念
数据的获取是指从数据库中加载数据,并标记数据对应用可用的过程。
数据的获取的策略影响了应用的性能。
2. 数据获取类型
Hibernate通过org.hibernate.jpamodelgen.xml.jaxb.FetchType枚举类型定义数据获取的类型如下:
- FetchType.EAGER
- FetchType.LAZY
3. 数据获取策略
1) static的数据获取策略,在Entity类中定义映射关系时确定
- SELECT,执行SQL语句的select加载数据(可以是EAGER/LAZY的)
- JOIN,执行SQL语句的outer join加载数据(EAGER的)
- BATCH,执行的SQL语句中,where字句中包含in关键字,以加载数据(可以是EAGER/LAZY的)
2) dynamic的数据获取策略,应用运行过程中确定
- Hibernate profile,在定义映射关系时确定,但是Session可以选择支持或不支持
- HQL/JPQL查询,在Hibernate查询或JPA Criteria查询中设置
- JPA entity graphs(Hibernate 4.2/JPA 2.1才支持)
4.示例
在JPA规范中,所有的一对一关联和多对一关联,被关联的数据默认都采用EAGER策略,这也是Hibernate默认支持的策略。
除此之外,Hibernate建议在配置Entity类中定义映射关系时(即static的数据获取策略)采用LAZY策略,而在应用运行时(即dynamic的数据获取策略)根据情况灵活设置EAGER策略。
Entity类中定义映射关系时(即static的数据获取策略)示例如下:
@Entity(name = "Employee")
public static class Employee {
@Id
private Long id;
@NaturalId
private String username;
@Column(name = "pswd")
@ColumnTransformer(
read = "decrypt( 'AES', '00', pswd )",
write = "encrypt('AES', '00', ?)"
)
private String password;
private int accessLevel;
@ManyToOne(fetch = FetchType.LAZY)
private Department department;
@ManyToMany(mappedBy = "employees")
private List<Project> projects = new ArrayList<>();
//Getters and setters omitted for brevity
}