Hibernate学习笔记 -- day11 Hibernate中的检索策略

来源:互联网 发布:国际软件学院合并 编辑:程序博客网 时间:2024/05/29 15:54

一、实体类的检索策略

1、涉及的方法

get:查询时机是立即加载

load:查询时机是延迟加载

二、关联对象的检索策略

1、明确

谁是那个关联对象。

例如:我们根据id查询客户,该客户下的联系人就是关联对象。我们根据id查询联系人,该联系人的所属客户就是关联对象

2、查询的时机

立即加载:不管用不用,只要一调用方法,马上发起查询

延迟加载:什么时候用什么时候去查询

3、应用方式

在一对多和多对多的关系时,我们都采用延迟加载策略。

在多对一和一对一的关系时,我们都采用立即加载策略。

三、对象导航图查询中的检索策略

1、有少的,什么时候去查多的:使用延迟加载(有客户,关联的是联系人)

(1)、问题:我们查询客户时,要不要把联系人查询出来?

(2)、解决方法:用延迟加载的思想。通过配置的方式来设定当我们在需要使用时,发起真正的查询。

2、配置查询机制的方式

注意:注解和XML在一对多的情况下:默认都是延迟加载。

(1)、注解上的使用:fetch=FetchType.LAZY属性

@OneToMany(targetEntity=LinkMan.class,mappedBy="customer",fetch=FetchType.LAZY)private Set<LinkMan> linkmans = new HashSet<LinkMan>(0);

(2)、XML上的使用:是set标签的属性.lazy="true"

在Customer.hbm.xml配置文件中的set标签上使用lazy属性。取值为true(默认值)|fasle<set name="linkmans" table="cst_linkman" inverse="true" lazy="true"><key column="lkm_cust_id"></key><one-to-many class="LinkMan"/></set>

3、有多的,什么时候去查少的:使用立即加载(有联系人,关联的客户)

(1)、问题:我们查询联系人时,要不要把客户查询出来?

(2)、解决方法:采用立即加载的思想。通过配置的方式来设定,只要查询从表实体,就把主表实体对象同时查出来。

4、配置查询机制的方式

注意:注解和XML在多对一的情况下:不一样

(1)、注解方式:默认是立即加载。

        在@OneToMany中使用fetch属性。

        取值FetchType.LAZY延迟加载,FetchType.EAGER

        立即加载使用的方式是左外连接  left outer join

//多对一关系映射:多个联系人对应客户@ManyToOne(targetEntity=Customer.class,fetch=FetchType.EAGER)@JoinColumn(name="lkm_cust_id",referencedColumnName="cust_id")private Customer customer;//用它的主键,对应联系人表中的外键

(2)、XML方式:属性是在many-to-one上,

        lazy属性配置为false的时候,立即加载。

        lazy属性的默认值是proxy,它是看少的一方class标签上的lazy属性取值。

xml的配置方式:在LinkMan.hbm.xml配置文件中的many-to-one标签上使用lazy属性。取值为proxy|faslefalse:立即加载proxy:看客户的映射文件class标签的lazy属性取值,如果客户的class标签lazy属性是true   那么proxy表示延迟加载,如果是false就表示立即加载。<many-to-one name="customer" class="Customer" column="lkm_cust_id" lazy="false"/>

四、案例演示

/** * hibernate中的检索策略: * 涉及的情况: *   实体类的检索策略: * 查询的方式是OID查询: * 涉及的方法: * get:查询时机是立即加载 * load:查询时机是延迟加载 *  关联对象的检索策略: *  明确:谁是那个关联对象。 *  举例:我们根据id查询客户,该客户下的联系人就是关联对象 *  我们根据id查询联系人,该联系人的所属客户就是关联对象 *  解决的就是查询的时机问题: *  立即加载:不管用不用,只要一调用方法,马上发起查询 *  延迟加载:什么时候用什么时候去查询 * 查询方式就是对象导航查询: * 分为两种情况: * 有少的,什么时候去查多的:使用延迟加载 * 有多的,什么时候去查少的:使用立即加载 * 配置的方式: * 注解和XML在一对多的情况下:默认都是延迟加载。 * 注解上使用:fetch=FetchType.LAZY属性 * XML上使用:是set标签的属性.lazy="true" * 注解和XML在多对一的情况下:不一样 * 注解: * 默认是立即加载。使用的方式是左外连接  left outer join * xml:属性是在many-to-one上 * lazy属性配置为false的时候。立即加载。 * lazy属性的默认值是proxy。 * 它是看少的一方class标签上的lazy属性取值。 *  * */public class HibernateDemo3 {/** * 根据客户对象获取客户下的所有联系人 */@Testpublic void test1(){Session s = HibernateUtil.getCurrentSession();Transaction tx = s.beginTransaction();Customer c = s.get(Customer.class,1L);System.out.println(c);System.out.println(c.getLinkmans());//延迟加载tx.commit();}/** * 根据联系人对象获取所属客户 */@Testpublic void test2(){Session s = HibernateUtil.getCurrentSession();Transaction tx = s.beginTransaction();LinkMan l = s.get(LinkMan.class,1L);System.out.println(l);System.out.println(l.getCustomer());//立即加载tx.commit();}}