hibernate的检索策略

Hibernate的检索策略分为三种

1类级别的检索策略,操作级别就是在单独一个表里面,不牵连其他表

类级别的检索策略(仅仅适合load()方法)
无论 <class> 元素的 lazy 属性是 true 还是 false, Session 的 get() 方法及 Query 的 list() 方法在类级别总是使用立即检索策略
若 <class> 元素的 lazy 属性为 true 或取默认值, Session 的 load() 方法不会执行查询数据表的 SELECT 语句, 仅返回代理类对象的实例,(称之为延迟加载) 该代理类实例有如下特征:
1由 Hibernate 在运行时采用 CGLIB 工具动态生成
2Hibernate 创建代理类实例时, 仅初始化其 OID 属性(因为在load的时候传递了OID)
3在应用程序第一次访问代理类实例的非 OID 属性时, Hibernate 会初始化代理类实例
 

2一对多和多对多的检索策略(其实就是对set标签的lazy、batch-size、fetch属性进行需要性设置)

在一对多和多对多的映射文件中,用 <set> 元素来配置一对多关联及多对多关联关系.(customer(1),order(n))
<set> 元素有 lazy 和 fetch 属性 lazy: 主要决定order集合被初始化的时机. 即到底是在加载 Customer 对象时就被初始化, 还是在程序访问 orders 集合时被初始化
    ---------------set 的 lazy 属性------------------
        //1. 1-n 或 n-n 的集合属性默认使用懒加载检索策略.
        //2. 可以通过设置 set 的 lazy 属性来修改默认的检索策略. 默认为 true
        //并不建议设置为  false. 
       //3. lazy 还可以设置为 extra. 增强的延迟检索. 该取值会尽可能的延迟集合初始化的时机!(能不加载集合对象,就不加载)
    //可以使用initialize()方法强制初始化集合对象(一般推荐这样使用)(大部分时候默认值就可以了)

<set> 元素的 batch-size 属性:设定一次初始化 set 集合的数量. 用来为延迟检索策略或立即检索策略设定批量检索的数量. 批量检索能减少 SELECT 语句的数目, 提高延迟检索或立即检索的运行性能. 
注意
初始化的集合不是被关联的对象:
example:
@Test
    public void testSetBatchSize(){
        List<Customer> customers = session.createQuery("FROM Customer").list();
        
        System.out.println(customers.size()); 
        
        for(Customer customer: customers){
            if(customer.getOrders() != null)
                System.out.println(customer.getCustomerName());
                System.out.println(customer.getOrders().iterator().next().getOrderName());
                System.out.println(customer.getOrders().getClass());
        }

运行上面的代码可以知道,初始化的只是list<>集合,但是并没有初始化被关联的对象order,所以batch-size初始化的值是当前方法set<>集合的对象,并不是被关联的对象(order)

set 集合的 fetch 属性: 确定初始化 orders 集合(被关联对象)的方式. 
1. 默认值为 select. 通过正常的方式来初始化 set 元素--就是懒加载
2. 可以取值为 subselect. 通过子查询的方式来初始化所有的 set 集合和所有被关联的对象. 子查询作为 where 子句的 in 的条件出现, 子查询查询所有 1 的一端的 ID. 此时 lazy 失效. batch-size 失效.
3. 若取值为 join.则决定 orders 集合和被关联对象被初始化的时机,也就是说lazy失效
3.1 在加载 1 的一端的对象时, 同时也使用迫切左外连接(使用左外链接进行查询, 且把集合属性进行初始化了)的方式检索 n 的一端的集合属性3.2 忽略 lazy 属性.
3.3 HQL(就是Hibernate的查询数据库的语句(跟sql不同))查询忽略 fetch=join 的取值

3多对一和一对一的关联策略(lazy、fetch、(这两个是属于many-to-one和one-to-one的)batch-size(是属于class的)进行设置)

 多对一和一对一的关联对应的是many-to-one和one-to-one,所以多对一和一对一的关联策略也是对这两个标签的属性进行设置

 策略设置:在所有关联关系中,所有被关联的对象都是默认的加载策略都是懒加载(所以多对一和一对一被关联的对象也不例外)

        1. lazy 取值为 proxy 和 false 分别代表对应对应的属性采用延迟检索和立即检索
        2. fetch 取值为 join, 表示使用迫切左外连接的方式初始化 n 关联的 1 的一端的属性忽略 lazy 属性. 
        3. batch-size, 该属性需要设置在 1 那一端的 class 元素中: 
        <class name="Customer" table="CUSTOMERS" lazy="true" batch-size="5">
        作用: 一次初始化 1 的这一段代理对象的个数. 

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。