Hibernate的检索策略

本文介绍了Hibernate提供的三种检索策略:延迟检索、立即检索和迫切左外连接,并详细解释了如何通过配置文件或程序来设定这些策略。同时,文章还探讨了不同检索策略在类级别和关联级别上的应用及注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Hibernate 提供了 3 种检索策略:

l        延迟检索;

l        立即检索;

l        迫切左外连接;

Hibernate 提供 2 种方式来确定检索策略,一中是在配置文件当中,另外一种是在程序种设置。当然,如果你在程序中设置了检索策略,那么你在配置文件中的设置也就无效了。另外的一种情况是 HQL 会忽略配置文件的设置,而总是采用迫切左外连接。

一、 类级别的检索

可以选择的检索策略是立即检索和延迟检索,默认的是立即检索。用配置文件中的 <class> 节点的 lazy 来控制。

注意:不管你在配置 classlazytrue 还是 false ,对 get()create Criteria () 方法都不起作用,只有对 load() 方法起作用。

当你使用的检索策略是 lazy 的时候,当你执行

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

的时候, Hibernate 不从数据库检索数据,而只是产生一个代理类,只有当你执行

Customer.getName();

的时候, Hibernate 才到数据库取数据。所以,如下的代码是会被抛出异常的:

Session session  =  sessionFactory.openSession();
transaction tx 
=   null ;
tx 
=  session.beginTransaction();
  Customer customer 
=  (Customer)session.load(Customer. class , new  Long( 1 ));
tx.commit();
  session.close();
customer.getName();

get() 方法总是用的立即检索,如果和它相关联的类也是用的立即检索,那么也会把相关联的数据也检索出来。

二、 一对和多对多关联检索

一般地,为了有减少对数据库的访问,我们往往用延迟检索的策略。所以,我们优先使用如下方式;

<set class=”order” inverse=”true’ lazy=”true” >

但是,我们在检索“多”的一方的时候, Hibernate 不能为我们产生代理类。由此,我们就要用 betch-size 的配置来减少 SQL 语句。

当我们使用 outer-join 属性的时候,我们就没有必要使用 lazy 属性了。 Outer-join 会一次将“一”方和与之相关的“多”方用左外连接的方式检索出来。

Session session = sessionFactory.openSession();

                     Transaction tx = null;

                     tx = session.beginTransaction();

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

产生的 SQL 语句如下:

Hibernate: select customer0_.ID as ID1_, customer0_.NAME as NAME2_1_, orders1_.CUSTOMER_ID as CUSTOMER3_3_, orders1_.ID as ID3_, orders1_.ID as ID0_, orders1_.ORDER_NUMBER as ORDER2_1_0_, orders1_.CUSTOMER_ID as CUSTOMER3_1_0_ from sampledb.customers customer0_ left outer join sampledb.orders orders1_ on customer0_.ID=orders1_.CUSTOMER_ID where customer0_.ID=?

145532.html

KE 2007-09-16 14:48 发表评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值