Hibernate中检索方式返回值的一些心得

 
    最近,学习了hibernate的一些使用方法和技巧。这里对什么是hibernate就不再赘述了 。下面我将对hibernate中的检索方式,谈谈我的心得:
   
    在hibernate中大致有默认情况、左外连接、迫切左外连接、内连接、迫切内连接、右外连接等几种方式。这里,假设程序中有一个Customer和Order两个PO对象:
package com.javasky.po;

import java.util.HashSet;
import java.util.Set;

/**
* Customers entity. @author MyEclipse Persistence Tools
*/

public class Customer implements java.io.Serializable {

   // Fields

   private Long id;
   private String name;
   private Integer age;
   private Set orders = new HashSet(0);

   // Constructors

   /** default constructor */
   public Customer() {
  }

   /** minimal constructor */
   public Customer(Long id) {
     this.id = id;
  }

   /** full constructor */
   public Customers(Long id, String name, Integer age, Set orders) {
     this.id = id;
     this.name = name;
     this.age = age;
     this.orders = orders;
  }

   // Property accessors
                 //getXXX()和setXXX()方法
    
}
   
package com.javasky.po;

/**
* Orders entity. @author MyEclipse Persistence Tools
*/

public class Order implements java.io.Serializable {

   // Fields

   private Long id;
   private Customer customer;
   private String orderNumber;
   private Double price;

   // Constructors

   /** default constructor */
   public Order() {
  }

   /** minimal constructor */
   public Orde(Long id) {
     this.id = id;
  }

   /** full constructor */
   public Order(Long id, Customer customer, String orderNumber, Double price) {
     this.id = id;
     this.customer = customer;
     this.orderNumber = orderNumber;
     this.price = price;
  }

   // Property accessors
                 //getXXX()和setXXX()方法                    

}
 
    在Cusoters.hbm.xml文件中对orders集合使用了延迟检索策略。在MySQL数据库中创建了CUSTOMERS和ORDERS两张表,ORDERS表参考CUSOTMERS表的主键。
 
(1)默认情况:查询单个CUSTOMERS表,对orders集合采用延迟检索策略。结果集中包含Customer类型的元素;Customer对象的orders集合没有被初始化。
 
(2)左外连接:左外连接查询CUSTOMERS表和ORDERS表,对orders集合采用延迟检索策略。结果集合中包含 对象数组类型元素,每个对象数组包含一对Customer对象和Order对象,不同对象数组可能重复引用一个Customer对象;集合不被初始化。
 
(3)迫切左外连接:左外连接查询CUSTOMERS表和ORDERS表,对orders采用迫切左外连接检索策略。结果集合中包含Customer类型的元素;集合中可能有重复的元素;Customer对象的orders集合被初始化。
 
(4)内连接:内连接查询CUSTOMERS表和ORDERS表,对orders集合采用延迟检索策略。结果集合中包含对象数组类型元素,每个对象数组包含一对Customer对象和Order对象,不同对象数组可能重复引用一个Customer对象;集合不被初始化。
 
(5)迫切内连接:内连接查询CUSTOMERS表和ORDERS表,对orders集合采用迫切内连接检索策略。结果集合中包含Customer类型元素;集合中可能有重复的元素;集合被初始化。
 
(6)右连接:右连接查询CUSTOMERS表和ORDERS表,延迟检索策略。结果集合中包含对象数组类型元素,每个对象数组包含一对Customer对象和Order对象,不同对象数组可能重复引用一个Customer对象;集合不被初始化。
 
    迫切左外连接和左外连接对应同样的的左外连接SQL查询语句,区别在于前者对Customer对象的orders集合初始化,而后者没有初始化。
 
    对象数组类型:是指在执行HQL或QBC语句后返回的结果集中不是持久化对象,而是关系数据,前者存放在session缓存中,后者接近于一般的SQL语句查询。以内连接为例说明如下:
    List list = session.createQuery("from Customer c join c.orders o where c.name like 'T%'").list();
    Object[] os = null;
    for(Iterator it = list.iterator();it.hasNext();){
        os = (Object[])it.next();
        Customer customer = (Customer)os[0];
        Order order = (Order)os[1];
        //若orders集合使用了延迟检索策略,下面代码会初始化Customer对象的orders集合
        customer.getOrders().iterator();
    }

你可能感兴趣的:(Hibernate,职场,休闲,延迟检索)