快速业务通道

使用动态代理解决Hibernate序列化,避免延迟加载问题 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-15

使用动态代理解决Hibernate序列化,避免延迟加载问题

时间:2011-09-09 badqiu

在使用Ajax: Hibernate Entity => json, Flex RemoteObject: Hibernate Entity => ActionScript Object的过程,经常碰到如下问题:

问题:

1.Hibernate碰到延迟加载的属性访问时如果session被关闭则抛出 LazyInitializationException

2.Hibernate中的one-to-many等关联关系在序列化时如果没有控制,则将整个 数据库都有可能被全部序列化

3.过多的使用DTO/ValueObject解决这个问题.

解决办法:

对Entity对象生成一个动态代理,拦截getXXXX()方法,如果访问的是延迟加载 的属性,则return null,而不抛出LazyInitializationException,递归生成属性 的代理,只要碰到未延迟加载的属性,而序列化会自动停止.避免将整个Entity序 列化传播,导致可能序列化整个数据库的问题.

类似解决方案:

dwr中HibernateConverter,在序列化时如上类似,碰到延迟加载的属性自动停 止convert工作.而HibernateBeanSerializer则一劳永逸,无论object => json都可以工作.

使用用例:

Java代码

//role为原始对象 role = (Role)roleDao.getById( new Long( 1 )); //生成的动态代理proxyRole,访问延迟加载的属性将return null Role proxyRole = (Role) new  HibernateBeanSerializer<Role>(role).getProxy (); assertNotNull(role.getResource()); assertNull (proxyRole.getResource()); //延迟加载,为null Hibernate.initialize (role.getResource()); //抓取进来   assertNotNull (proxyRole.getResource()); //不为null //role为原始对象 role = (Role)roleDao.getById(new Long(1)); //生成的动态代理proxyRole,访问 延迟加载的属性将return null Role proxyRole = (Role)new HibernateBeanSerializer<Role>(role).getProxy (); assertNotNull(role.getResource()); assertNull (proxyRole.getResource()); //延迟加载,为null Hibernate.initialize (role.getResource()); //抓取进来 assertNotNull (proxyRole.getResource()); //不为null

聞喘強蓑旗尖盾畳Hibernate會双晒?閲窒决岳紗墮諒籾(2)

扮寂:2011-09-09 badqiu

坿鷹.

Java旗鷹

package cn.org.rapid_framework.util; import  java.lang.reflect.Modifier; import java.util.ArrayList; import  java.util.Collection; import java.util.LinkedHashMap; import  java.util.LinkedHashSet; import java.util.List; import  java.util.Map; import java.util.Set; import  org.aopalliance.intercept.MethodInterceptor; import  org.aopalliance.intercept.MethodInvocation; import  org.hibernate.Hibernate; import  org.hibernate.collection.PersistentCollection; import  org.hibernate.proxy.HibernateProxy; import  org.springframework.aop.framework.ProxyFactory; import  org.springframework.util.StringUtils; /**  * 喘噐Hibernate Object 議會双晒,恵諒决岳紗墮議奉來音氏砺竃LazyInitializationException, 遇氏卦指null峙.  * 聞喘:  * <pre> * Blog proxyBlog = new HibernateBeanSerializer(blog).getProxy(); * </pre> * @author badqiu  * @param <T> */   public  class  HibernateBeanSerializer <T> {   T proxy = null ;    /**     */      public HibernateBeanSerializer(T object,String... excludesProperties) {      if (object == null ) {        this .proxy = null ;     } else {        ProxyFactory pf = new ProxyFactory();    

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号