您的位置:首页 > 数据库

Hibernate 关联映射 之 一对多单项关联 (二)聪明的懒加载

2012-07-12 07:12 267 查看
1、在映射文件中,关联的集合对象的懒加载Lazy有三种值:true、false、extra,通常我们使用extra,原因是该加载性能好。

   对比下true 和 extra 两个值的不同加载情况

   比如:有这样的两个需求:一、计算下改组下有多少联系人;二、改组下是否包含“张三”这个人

需求一的实现:

public void  testOnetoMany() {
Session session = HibernateUtil.getSession();//语句20
try {
session.beginTransaction();
Group g = (Group)session.load(Group.class,1);//语句1
System.out.println(g.getCps().size());//语句2
session.getTransaction().commit();
}catch(Exception e) {
e.printStackTrace();
session.getTransaction().rollback();
}finally {
session.close();
}
}

注解:执行完语句1不会发出Select语句(Group对象使用了懒加载),执行完语句2中的g.getCps(),会发出对Group对象的Select语句.

如果映射文件中关联对象的懒加载值为true,则执行.size()继续发出对ContactPerson对象的Select语句加载到内存,然后再计算有多少人,而如果是extra,发出的select语句是:select count(id) from contactPerson where gid =? 将取好的值返回给客户端。

需求二的实现:

public void  testOnetoMany() {
Session session = HibernateUtil.getSession();//语句20
try {
session.beginTransaction();
Group g = (Group)session.load(Group.class,1);//语句1
ContactPerson cp = new ContactPerson();
cp.setId(2);
System.out.println(g.getCps().contains(cp));//语句2
session.getTransaction().commit();
}catch(Exception e) {
e.printStackTrace();
session.getTransaction().rollback();
}finally {
session.close();
}
}

注解:执行完语句2之后,如果懒加载设置的值为true,则后台打印出来的值为false,如果设置的值为extra,则打印出来的值为true(数据库存在ID为2的前提下)

原因是:如果设置extra,这里的contains方法,hibernate改变了缺省的集合的特性,即equals方法。

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息