首页 / 软件开发 / JAVA / 使用动态代理解决Hibernate序列化,避免延迟加载问题
使用动态代理解决Hibernate序列化,避免延迟加载问题2011-09-09badqiu在使用Ajax: Hibernate Entity => json, Flex RemoteObject: Hibernate Entity => ActionScript Object的过程,经常碰到如下问题:问题:1.Hibernate碰到延迟加载的属性访问时如果session被关闭则抛出 LazyInitializationException2.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