Hibernate从零开始_09_检索策略

    Hibernate4的检索策略分为:类级别检索和关联级别检索两大类。

    1、类级别检索

        类级别检索分为立即检索、延迟检索。对于Session的检索方式,类级别检索策略仅适用于load方法。是通过<class>中的 'lazy'属性来确定的,而类级别的lazy属性默认是true。

  <!-- lazy 的默认属性 true -->
  <class name="com.study.hibernate.domain.Customer" table="t_customer" catalog="db_hibernate" lazy="false">
@Test
 public void queryTest(){
  Configuration configuration = new Configuration().configure();
  ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry();
  SessionFactory sessionFactory = configuration.buildSessionFactory(serviceRegistry);
  Session session = sessionFactory.openSession();
  Transaction tracsaction = session.beginTransaction();
  //lazy=true时
  //Customer customer = (Customer) session.get(Customer.class, new Long(1));
  //结果
  //Hibernate: /* load com.study.hibernate.domain.Customer */ select customer0_.id as id1_0_0_, customer0_.name as name2_0_0_ from db_hibernate.t_customer customer0_ where customer0_.id=?
  
  Customer customer1 = (Customer) session.load(Customer.class, new Long(1));
  //结果
  //没有执行查询语句
  
  //当触发了customer1对象里的get()方法时才执行了查询
  //customer1.getName();
  //Hibernate: /* load com.study.hibernate.domain.Customer */ select customer0_.id as id1_0_0_, customer0_.name as name2_0_0_ from db_hibernate.t_customer customer0_ where customer0_.id=?
  
  tracsaction.commit();
  session.close();
  sessionFactory.close();
 }

 

    2、关联级别检索

        关联级别检索分为:立即检索、延迟检索、迫切左外连接检索。

   1) 立即检索

        get()方法和query查询方式都为立即检索。

    2)延迟检索
<set name="orders" cascade="all" lazy="false"> <!-- lazy默认为 true -->
  Customer customer1 = (Customer) session.load(Customer.class, new Long(1));
  customer1.getName(); 
  
  //结果
  Hibernate: /* load com.study.hibernate.domain.Customer */ select customer0_.id as id1_0_0_, customer0_.name as name2_0_0_ from db_hibernate.t_customer customer0_ where customer0_.id=?
Hibernate: /* load one-to-many com.study.hibernate.domain.Customer.orders */ select orders0_.customer_id as customer3_0_1_, orders0_.id as id1_1_1_, orders0_.id as id1_1_0_, orders0_.name as name2_1_0_, orders0_.customer_id as customer3_1_0_ from db_hibernate.t_orders orders0_ where orders0_.customer_id=?

    当lazy=false时customer对象被加载的同时,orders对象也被加载

    3)迫切左外连接检索
<set name="orders" cascade="all" fetch="join">
  Customer customer1 = (Customer) session.load(Customer.class, new Long(1));
  System.out.println(customer1);
  
  //结果
  Hibernate: /* load com.study.hibernate.domain.Customer */ select customer0_.id as id1_0_1_, customer0_.name as name2_0_1_, orders1_.customer_id as customer3_0_3_, orders1_.id as id1_1_3_,orders1_.id as id1_1_0_, orders1_.name as name2_1_0_, orders1_.customer_id as customer3_1_0_ from db_hibernate.t_customer customer0_ left outer join db_hibernate.t_orders orders1_ on customer0_.id=orders1_.customer_id where customer0_.id=?
Customer [id=1, name=zhangsan, orders=[Orders [id=2, name=apple], Orders [id=1, name=orange]]]

    当fetch="join" 时 为立即检索其SQL语句为左外连接,忽略lazy="true"。

    

你可能感兴趣的:(Hibernate,Hibernate,延迟加载,fetch,lazy,迫切左外连接)