博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Hibernate 检索策略
阅读量:4359 次
发布时间:2019-06-07

本文共 6516 字,大约阅读时间需要 21 分钟。

Hibernate 的检索有两种:

  1:立即检索。立即加载检索方法指定的对象。

  2:延迟检索。延迟加载检索方法指定的对象。

好比老板让你去买包烟。然后1是拿着钱就去买了。2是先拿着钱。然后答应老板去买。等老板要抽烟的时候她才去买。

准备持久化类和相对应的映射文件。

package com.hibernate.strategy;import java.util.HashSet;import java.util.Set;public class Customer {    private Integer customerId;    private String customerName;        private Set
orders = new HashSet
(); public Integer getCustomerId() { return customerId; } public void setCustomerId(Integer customerId) { this.customerId = customerId; } public String getCustomerName() { return customerName; } public void setCustomerName(String customerName) { this.customerName = customerName; } public Set
getOrders() { return orders; } public void setOrders(Set
orders) { this.orders = orders; } }
package com.hibernate.strategy;public class Order {        private Integer orderId;    private String orderName;        private Customer customer;    public Integer getOrderId() {        return orderId;    }    public void setOrderId(Integer orderId) {        this.orderId = orderId;    }    public String getOrderName() {        return orderName;    }    public void setOrderName(String orderName) {        this.orderName = orderName;    }    public Customer getCustomer() {        return customer;    }    public void setCustomer(Customer customer) {        this.customer = customer;    }    @Override    public int hashCode() {        final int prime = 31;        int result = 1;        result = prime * result + ((orderId == null) ? 0 : orderId.hashCode());        return result;    }    @Override    public boolean equals(Object obj) {        if (this == obj)            return true;        if (obj == null)            return false;        if (getClass() != obj.getClass())            return false;        Order other = (Order) obj;        if (orderId == null) {            if (other.orderId != null)                return false;        } else if (!orderId.equals(other.orderId))            return false;        return true;    } }

开始操作:

  1:类级别的检索。通过设置<class>元素的lazy属性。

    1):get方法获得类对象。

@Test    public void testLeiStrategy(){        Customer customer=(Customer) session.get(Customer.class, 1);        System.out.println(customer.getCustomerName());        System.out.println(customer.getClass());    }

解释:得到的是类本身。get是立即检索。

  2):load方法

1 @Test2     public void testLeiStrategy(){3         Customer customer=(Customer) session.load(Customer.class, 1);4         System.out.println(customer.getCustomerName());5         System.out.println(customer.getClass());6     }

解释:返回的是一个代理对象。是延迟检索。

通过设置 

懒惰相反。就是立即加载。返回的也是一个customer类对象。

lazy="false"   只对load有效。对get无效。 2:一对多。多对多检索

因为无论是1对多,还是多对多。都是多的作为一个set集合,放到1 或多的中。其实就是对<set>设置。

  1):lazy:主要决定orders集合被初始化的时机。一共有三个设置。true 是默认的。false 立即加载。  extra就是增加延迟加载。就是比延迟加载还狠。

  2):fetch 决定初始化集合orders的查询语句的方式。

    1>:默认:select 正常的查询。

    2>:subselect   子查询的形式。因为是子查询。所以in()中需要order的ID。都要把set集合中的order都查询出来。batch-size会失效。

    3>:join  检索1一端的时候。采用迫切左外连接去检索集合order。lazy会失效。

@Test    public void testGetFeth(){        List
customers=session.createQuery("FROM Customer").list(); System.out.println(customers.size()); for(Customer customer :customers){ if(customer.getOrders() != null){ System.out.println(customer.getOrders().size()); } } }

fetch="subselect"  查询的结果

解释:把order都给初始化了。

用select:

Hibernate:     select        customer0_.CUSTOMER_ID as CUSTOMER1_0_,        customer0_.CUSTOMER_NAME as CUSTOMER2_0_     from        CUSTOMERS customer0_4Hibernate:     select        orders0_.CUSTOMER_ID as CUSTOMER3_0_1_,        orders0_.ORDER_ID as ORDER_ID1_1_1_,        orders0_.ORDER_ID as ORDER_ID1_1_0_,        orders0_.ORDER_NAME as ORDER_NA2_1_0_,        orders0_.CUSTOMER_ID as CUSTOMER3_1_0_     from        ORDERS orders0_     where        orders0_.CUSTOMER_ID=?     order by        orders0_.ORDER_NAME desc2Hibernate:     select        orders0_.CUSTOMER_ID as CUSTOMER3_0_1_,        orders0_.ORDER_ID as ORDER_ID1_1_1_,        orders0_.ORDER_ID as ORDER_ID1_1_0_,        orders0_.ORDER_NAME as ORDER_NA2_1_0_,        orders0_.CUSTOMER_ID as CUSTOMER3_1_0_     from        ORDERS orders0_     where        orders0_.CUSTOMER_ID=?     order by        orders0_.ORDER_NAME desc2Hibernate:     select        orders0_.CUSTOMER_ID as CUSTOMER3_0_1_,        orders0_.ORDER_ID as ORDER_ID1_1_1_,        orders0_.ORDER_ID as ORDER_ID1_1_0_,        orders0_.ORDER_NAME as ORDER_NA2_1_0_,        orders0_.CUSTOMER_ID as CUSTOMER3_1_0_     from        ORDERS orders0_     where        orders0_.CUSTOMER_ID=?     order by        orders0_.ORDER_NAME desc3Hibernate:     select        orders0_.CUSTOMER_ID as CUSTOMER3_0_1_,        orders0_.ORDER_ID as ORDER_ID1_1_1_,        orders0_.ORDER_ID as ORDER_ID1_1_0_,        orders0_.ORDER_NAME as ORDER_NA2_1_0_,        orders0_.CUSTOMER_ID as CUSTOMER3_1_0_     from        ORDERS orders0_     where        orders0_.CUSTOMER_ID=?     order by        orders0_.ORDER_NAME desc1

需要1次查询一次。

  3>:join

@Test    public void testSetFetch2(){        Customer customer = (Customer) session.get(Customer.class, 1);        System.out.println(customer.getOrders().size());     }
Hibernate:     select        customer0_.CUSTOMER_ID as CUSTOMER1_0_1_,        customer0_.CUSTOMER_NAME as CUSTOMER2_0_1_,        orders1_.CUSTOMER_ID as CUSTOMER3_0_3_,        orders1_.ORDER_ID as ORDER_ID1_1_3_,        orders1_.ORDER_ID as ORDER_ID1_1_0_,        orders1_.ORDER_NAME as ORDER_NA2_1_0_,        orders1_.CUSTOMER_ID as CUSTOMER3_1_0_     from        CUSTOMERS customer0_     left outer join        ORDERS orders1_             on customer0_.CUSTOMER_ID=orders1_.CUSTOMER_ID     where        customer0_.CUSTOMER_ID=?     order by        orders1_.ORDER_NAME desc2

3:多对1  1对1

都是把1的一方放到多的。作为多的一个属性。

 

 false  :默认的。

proxy :延迟加载。

no-proxy:无代理延迟加载。

fetch只有2个

 

转载于:https://www.cnblogs.com/bulrush/p/7811867.html

你可能感兴趣的文章
PHP中开启和关闭错误信息的提示
查看>>
C++ 中的一些错觉
查看>>
xshell配色方案
查看>>
使用注解实现 bean 转 csv
查看>>
iOS相机去黑框
查看>>
eclipse+webservice开发实例
查看>>
【bzoj2002】弹飞绵羊——分块
查看>>
php读取数据库数据,出现中文乱码(数据库中没有出现乱码)
查看>>
selenium动作链
查看>>
敏捷外包工程系列之二:人员结构(敏捷外包工程,敏捷开发,产品负责人,客户价值)...
查看>>
《设计你的人生》的部分经典语录
查看>>
mustache多次渲染和多个赋值
查看>>
《Flutter 实战》开源电子书
查看>>
Python 键盘记录
查看>>
HDU 1381 Crazy Search
查看>>
NYOJ 311 完全背包
查看>>
几本书
查看>>
PLSQL
查看>>
修改计算机名
查看>>
Android-Activity的启动模式
查看>>