用aop解决flex,hibernate延迟加载问题
来源:互联网 发布:网络病毒营销 编辑:程序博客网 时间:2024/06/05 15:47
Technorati 标签: flex,java,lazyload,hibernate
有很多同学在用使用flex+hibernate做应用开发时都会出现由延迟加载导致的异常:Could not initialize proxy…………….
笔者在使用ibatis2.x做持久层时,也遇到这个问题,究其原因,在于blazeds无法正常序列化Java端返回的代理类。
而hibernate默认会对类属性和集合属性返回代理,在大多数情况下这都是很合理的,即使要在web端访问代理属性,也可以采用openSessionInView模式,将session延伸到web层。但是flex的客户端比较特殊,不宜采取这种做法。针对这个问题,有一些开源的解决方案:dpHibernate,Glead等,但笔者感觉这些框架侵入性太强,不宜采用。
在不引入第三方框架的情况下,可以采取两个办法:1.增加一层Vo类,将类属性和集合属性的代理进行转化,然后与as映射,传给flex端 ,这样序列化是ok的。
2.采用Spring 的aop解决方案,对可能返回无法正常序列化的pojo方法进行拦截。步骤如下:
1.开启@AspectJ
2.编写针对具有代理属性类的转化工具类:假如Student类具有多对一的类属性Grade:
public class Student {private Long id;private Grade grade;public Long getId() {return id;}public void setId(Long id) {this.id = id;}public Grade getGrade() {return grade;}public void setGrade(Grade grade) {this.grade = grade;}}
用代码生成器生成StudentConvert.java :
public class StudentConverter { public static Student convert2Student(Object sourceObj) { Student source=(Student) sourceObj; Student target = new Student(); target.setId(source.getId()); //Hibernate.initialize(source.getGrade()); 可以选择将类或集合代理初始化 //target.setGrade(source.getGrade()); return target; } public static List convert2StudentList(List oldlist) { List newlist= new ArrayList(); for(Object sourceObj : oldlist) { newlist.add(convert2Student(sourceObj)); } return newlist; }}
3.编写aop的advisor进行环绕通知,假设StudentDao 有两个方法
Student findById(Long id)
List findAll();
由代码生成器生成对应的advisor如下 HibernateAdvisor.java :
@Aspectpublic class HibernateAdvisor {//insert aop code for hibernate ///////////////////////////// Student readme////////////////////////////** * 必须为final String类型的,注解里要使用的变量只能是静态常量类型的 */// 切入点定义public static final String StudentList = "execution(* com.lai.flex.service.StudentDao.findAll(..))";public static final String Student = "execution(* com.lai.flex.service.StudentDao.findBy*(..))";@Around(StudentList)public List convertStudentList(ProceedingJoinPoint joinPoint) {//System.out.println("Convert之前");Object[] args = joinPoint.getArgs();Object obj = null;List newlist= null;try {obj = joinPoint.proceed(args);List old= (List) obj;newlist=(StudentConverter.convert2StudentList(oldlist));} catch (Throwable e) {e.printStackTrace();}//System.out.println("Convert之后"); // 方法执行后的代理处理return newlist;}@Around(Student)public Student convertStudent(ProceedingJoinPoint joinPoint) {//System.out.println("Convert之前");Object[] args = joinPoint.getArgs();Object obj = null;Student newsStudent = null;try {obj = joinPoint.proceed(args);newsStudent = StudentConverter.convert2Student(obj);} catch (Throwable e) {e.printStackTrace();}//System.out.println("Convert之后"); // 方法执行后的代理处理return newsStudent;}// generator-insert-location }
最后,由StudentDao方法返回的代理类和集合属性在序列化到flex端之前,都被拦截,进行转化后,可以正常序列化了。
声明:如需转载,请注明作者-hhlai1990@gmail.com
欢迎大家使用rapid-framework快速开发框架以及rapid-generator代码生成器
http://code.google.com/p/rapid-framework
- 用aop解决flex,hibernate延迟加载问题
- DWR3.0解决hibernate延迟加载问题
- 解决Hibernate延迟加载出现的问题
- hibernate延迟加载问题
- Hibernate延迟加载问题
- Hibernate延迟加载问题
- Hibernate延迟加载问题
- json解决hibernate中级联对象延迟加载有关问题
- 使用Hibernate.initialize解决no session的延迟加载问题
- 使用Hibernate.initialize解决no session的延迟加载问题
- Hibernate_使用clone解决hibernate延迟加载问题及分析
- Hibernate延迟加载以及利用Spring事务完美解决延迟加载问题
- hibernate 延迟加载问题探讨
- hibernate 延迟加载问题探讨
- hibernate 延迟加载问题探讨
- 再说hibernate延迟加载问题
- hibernate 延迟加载问题探讨
- hibernate的延迟加载问题
- mmap函数的使用
- 吴导的"剑雨"其实是一部考证的电影
- 第一次登陆,大家多多关照
- 配置数据源
- silverlight 子窗口关闭后刷新父页面列表数据
- 用aop解决flex,hibernate延迟加载问题
- 学外语五大忌讳
- 我的一天
- remove() empty() after()
- 强大的线性时间筛法
- 高性能计算技术研究中心 C/C++软件开发工程师
- Java -- 名字重用术语 -- 覆写--隐藏--重载--
- 开启 Teredo 通道, 提前感受 IPv6 (for 非教育网用户)
- Android研究之Activity组件