Hibernate中用proxy实现类的延迟加载

 可以在 .xml 文件中指定 lazy=”true” 这个属性来实现:
 
<class name="com.test.Student" table="student" lazy="true"> 这种方式等价于
<class name="com.test.Student" table="student" proxy="com.test.Student">
 
这样 Hibernate 就会自动继承 Student 这个类,来生成一个代理类,这个代理类是实现延迟加载的关键,比如一个 Student 类有很多属性,所以就希望当用到Student的属性的时候(调用getXXX())才去数据库读取,这个时候 时候就可以使用Student的代理类如 StudentProxy来实现Student的延迟加载!
 
Student student =  (Student)session.load(Student.class, id);   //如果使用proxy的话,Hibernate在执行这句话的时候根本就不会去执行select操作,而这句话的作用仅仅是用cglib来初始化代理类(setSid(id)...)。
 
student.getSname();       //当执行这句化的时候,Hibernate才会去执行select操作,读取数据库,如下是Hibernate执行此句时候输出的sql
Hibernate: select student0_.sid as sid0_, student0_.sname as sname0_, student0_.sage as sage0_ from student student0_ where student0_.sid=?
 
实现原理:proxy其实和JDK1.3的动态代理没有什么区别,只不过JDK1.3的动态代理只能代理接口,而我们在应用Hibernate的时候要代理类,所以必须用cglib来实现动态代理类的功能。
 
下面用JDK的Dynamic Proxy大概说明一下实现过程,大致代码如下:
 
package com.test;
 
import java.lang.reflect.Proxy;  
    import java.lang.reflect.InvocationHandler; 
    import java.lang.reflect.Method;   
 
public class ProxyTest implements InvocationHandler
    {
        public Student student;
    public ProxyTest(Student student)
        { 
            this.student = student;
        }
    public static Student getStudent(Student student)
        {
            return (Student)(Proxy.newProxyInstance(Student.class.getClassLoader(),new Class[]{Student.class},new StudentProxy(student)));
        }

        public Object invoke(Object proxy, Method m, Object[] args) throws Throwable
        {
            Object obj = null;
      
            if(“getSname”.equals(m.getSname()))    //当执行的方法为getSname()的时候,就从数据库加载Student类
            {
                loadById();   //执行select操作;
             obj = m.invoke(student, args);  
            }
            else
                 obj = m.invoke(student, args);   
            return obj;
        }
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值