Hibernate4的检索策略分为:类级别检索和关联级别检索两大类。
类级别检索分为立即检索、延迟检索。对于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(); }
关联级别检索分为:立即检索、延迟检索、迫切左外连接检索。
get()方法和query查询方式都为立即检索。
<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对象也被加载
<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"。