Hibernate中用proxy(代理)实现类的延迟加载
2010-09-26 15:36
369 查看
可以在.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;
}
}
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/luedipiaofeng/archive/2007/07/04/1678574.aspx
<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;
}
}
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/luedipiaofeng/archive/2007/07/04/1678574.aspx
相关文章推荐
- 关于延迟加载(lazy)和强制加载(Hibernate.initialize(Object proxy) ) 等
- hibernate 如何实现延迟加载
- Hibernate 延迟加载剖析与代理模式应用
- php中通过虚代理实现延迟加载的实现代码
- Hibernate 延迟加载剖析与代理模式应用
- 自己编写的一个Json工具类,实现了反射将整个Object转换为Json对象的功能,支持Hibernate的延迟加载对象
- .Net动态代理Castle系列(二)--- ORM中延迟加载及实现
- 【转载】Hibernate 延迟加载剖析与代理模式应用
- 【转载】Hibernate 延迟加载剖析与代理模式应用
- hibernate延迟加载的传说级错误org.hibernate.LazyInitializationException: could not initialize proxy - no Session
- 关于延迟加载(lazy)和强制加载(Hibernate.initialize(Object proxy) )
- PHP中使用虚代理实现延迟加载技术
- hibernate 延迟加载底层实现机制
- Hibernate中用proxy实现类的延迟加载
- 延迟加载 ERROR org.hibernate.LazyInitializationException:42 - could not initialize proxy - ...
- [转]PO和VO、关于延迟加载(lazy)和强制加载(Hibernate.initialize(Object proxy) )
- Hibernate 延迟加载剖析与代理模式应用
- hibernate延迟加载问题-------could not initialize proxy - no Session
- Hibernate 延迟加载剖析与代理模式应用