Hibernate 检索策略

Hibernate的检索策略可以分为类级别的检索策略和关联级别的检索策略。

类级别可选的检索策略包括:立即加载和延迟加载,在类级别上,hibernate默认的检索策略为延迟加载,即lazy=ture

类级别的load检索策略:

立即加载:

    Customer customer = (Customer)session.load(Customer.class,new Long(1));

    当上面一条语句执行到时,hibernate会立即输出以下语句:

    select * from customers where id = 1;

    这个时候customer就已经实例化了。

延迟加载:

    Customer customer = (Customer)session.load(Customer.class,new Long(1));

    上面语句执行到时hibernate不会立即查询customer表,而是返回customer类的代理类的实例。

     这个代理类有以下的特征:

     1)Hibernate在运行时动态生成,它扩展了customer类,因此它继承了customer的所有属性和方法,但是它的实现对于应用程序是透明的。

     2)当hibernate创建customer代理类实例时,仅仅初始化了它的OID,其他属性都为null,因此这个代理类占用的内存很少。

     3)当程序第一次访问代理类的实例时,hibernate会初始化代理类实例,这时才真正区数据库查询。但是如果仅仅是方位代理类的getId(),hibernate仍然不会区访问数据库。

以上讨论的是类级别load的检索策略,如果是使用session的get 和 find接口进行数据查询的话不关class的检索策略设置为什么都会使用立即检索策略。

   如果使用load进行查询(不关是立即加载还是延迟加载),都会生成customer的代理类实例,这样我们在判断customer==null时就一定为false,而不能准确的知道数据库中是否存在这样的实例。

   (不推荐使用load,用起来麻烦)



关联级别的检索策略

关联级别的检索策略分为立即检索(默认的检索方式)、延迟检索和outer-join检索


batch-size的使用

在进行立即检索的时候,例如使用如下的sql语句:select * from customer;会立即去加载customer所关联的order对象,并且会产生多条select 语句,一个customer执行一次,而如果使用batch-size属性,会一次加载多条customer的order list,这样就会减少和数据库的交互。同样,在进行延迟加载的时候也会出现这样的问题。



fetch 和 lazy 主要是用来级联查询的,    而 cascade 和 inverse 主要是用来级联插入和修改的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值