最近,学习了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();
}