快速业务通道

Hibernate通用序列化方案,避免延迟加载问题及序列化整个数据库至客户端 - 编程入门网

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

Hibernate通用序列化方案,避免延迟加载问题及序列化整个数据库至客户端

时间:2011-01-03 javaeye 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

源码.

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();    pf.setTargetClass(object.getClass());    pf.setOptimize(true);    pf.setTarget(object);    pf.setProxyTargetClass(true);    pf.setOpaque(true);    pf.setExposeProxy(true);    pf.setPreFiltered(true);    HibernateBeanSerializerAdvice beanSerializerAdvice = new HibernateBeanSerializerAdvice();    beanSerializerAdvice.setExcludesProperties(excludesProperties);    pf.addAdvice(beanSerializerAdvice);    this.proxy = (T)pf.getProxy();   }   }   public T getProxy

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号