java-web hibernate中的懒加载问题

java-web hibernate中的懒加载问题


懒加载异常

1.延迟加载机制	延迟加载机制是为了避免一些无谓的性能开销而提出来的,所谓延迟加载就是当在真正需要数据的时候,才真正执行数据加载操作。在Hibernate中提供了对实体对象的延迟加载以及对集合的延迟加载,另外在Hibernate3中还提供了对属性的延迟加载。

实体对象的延迟加载:如果想对实体对象使用延迟加载,必须要在实体的映射配置文件中进行相应的配置,	<hibernate-mapping><class name=”com.enterise.domain.User” table=”user” lazy=”true”>	通过将class的lazy属性设置为true(默认情况下是true),来开启实体的延迟加载特性。
User user=(User)session.load(User.class,”1”);
当运行到这里的时候:
Hibernate并没有发起对数据的查询,如果我们此时通过一些调试工具(比如JBuilder2005的Debug工具),观察此时user对象的内存快照,我们会惊奇的发现,此时返回的可能是User$EnhancerByCGLIB$$bede8986类型的对象,而且其属性为null,这是怎么回事?还记得前面我曾讲过session.load()方法,会返回实体对象的代理类对象,这里所返回的对象类型就是User对象的代理类对象。在Hibernate中通过使用CGLIB,来实现动态构造一个目标对象的代理类对象,并且在代理类对象中包含目标对象的所有属性和方法,而且所有属性均被赋值为null。通过调试器显示的内存快照,我们可以看出此时真正的User对象,是包含在代理对象的CGLIB$CALBACK_0.target属性中
System.out.println(user.getName());
当运行到处时,此时调用user.getName()方法,这时通过CGLIB赋予的回调机制,实际上调用CGLIB$CALBACK_0.getName()方法,当调用该方法时,Hibernate会首先检查CGLIB$CALBACK_0.target属性是否为null,如果不为空,则调用目标对象的getName方法,如果为空,则会发起数据库查询,生成类似这样的SQL语句:select * from user where id=’1’;来查询数据,并构造目标对象,并且将它赋值到CGLIB$CALBACK_0.target属性中。   这样,通过一个中间代理对象,Hibernate实现了实体的延迟加载,只有当用户真正发起获得实体对象属性的动作时,才真正会发起数据库查询操作。所以实体的延迟加载是用通过中间代理类完成的,所以只有session.load()方法才会利用实体延迟加载,因为只有session.load()方法才会返回实体类的代理类对象。

	get()无懒加载特性,马上执行SQL查询. 
load()有懒加载特性,会返加一个代理对象,所以永远不为null,先不执行SQL,要取对象的值时才执行SQL语句,前题session不能关闭,<class>标签上lazy不为false. 

问题:懒加载异常
org.apache.jasper.JasperException: org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.enterise.always.oa.bean.User.roles, no session or session was closed
出现问题的原因:在jsp使用getxxx();去获取与这个对象相关连的对象的属性的时候,就会出现初始化异常的信息,是由于对于相关联的session已经关闭。
解决机制:
1.在相关联的属性上设置:lazy = "false";
2.使用过滤器(一定要配置在spring初始化容器下面):
 <filter>
        <filter-name>OpenSessionInViewFilter</filter-name>
        <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
   </filter>
   <filter-mapping>
        <filter-name>OpenSessionInViewFilter</filter-name>
        <url-pattern>*.action</url-pattern>
    <filter-mapping>

 
 


你可能感兴趣的:(java-web hibernate中的懒加载问题)