flex的hibernate(延迟加载)解决方案

最近在搞flex+java,用了spring和hibernate,通过blazeds通信。但是我发现blazeds无法实现hibernate的延迟加载功能,更可恨的是当进行通信的时候,对象中的所有关联关系都被强制加载了,这与blazeds的原理有关(blazeds将对象所有的属性进行了遍历,造成了属性的加载)。网上有些flex的延迟加载解决方案,比如dbhibernate,但是并不好用。

我现在的解决方法是:去掉了绝大部分的关联关系,关掉了延迟加载功能(没有了关联关系,延迟加载也没有意义了),这样就靠自己维护关系了。只是比以前多出了一点代码量。

你也可以直接不用hibernate。

或者自己对hibernate取到的对象进行一次封装,再传给flex,这样就不会被强制加载了

针对这个问题,有一些开源的解决方案:dpHibernate,Glead等,但笔者感觉这些框架侵入性太强,不宜采用。

在不引入第三方框架的情况下,可以采取两个办法:1.增加一层Vo类,将类属性和集合属性的代理进行转化,然后与as映射,传给flex端,这样序列化是ok的。

2.采用Spring的aop解决方案,对可能返回无法正常序列化的pojo方法进行拦截。步骤如下:

1.开启@AspectJ

<aop:aspectj-autoproxy/>

2.编写针对具有代理属性类的转化工具类:假如Student类具有多对一的类属性Grade:

publicclassStudent{

privateLongid;

privateGradegrade;

publicLonggetId(){

returnid;

}

publicvoidsetId(Longid){

this.id=id;

}

publicGradegetGrade(){

returngrade;

}

publicvoidsetGrade(Gradegrade){

this.grade=grade;

}

}

用代码生成器生成StudentConvert.java:

publicclassStudentConverter{

publicstaticStudentconvert2Student(ObjectsourceObj){

Studentsource=(Student)sourceObj;

Studenttarget=newStudent();

target.setId(source.getId());

//Hibernate.initialize(source.getGrade());可以选择将类或集合代理初始化

//target.setGrade(source.getGrade());

returntarget;

}

publicstaticListconvert2StudentList(Listoldlist){

Listnewlist=newArrayList();

for(ObjectsourceObj:oldlist){

newlist.add(convert2Student(sourceObj));

}

returnnewlist;

}

}

3.编写aop的advisor进行环绕通知,假设StudentDao有两个方法

StudentfindById(Longid)

ListfindAll();

由代码生成器生成对应的advisor如下HibernateAdvisor.java:

@Aspect

publicclassHibernateAdvisor{

//insertaopcodeforhibernate

///////////////////////////

//Studentreadme

///////////////////////////

/**

*必须为finalString类型的,注解里要使用的变量只能是静态常量类型的

*/

//切入点定义

publicstaticfinalStringStudentList="execution(*com.lai.flex.service.StudentDao.findAll(..))";

publicstaticfinalStringStudent="execution(*com.lai.flex.service.StudentDao.findBy*(..))";

@Around(StudentList)

publicListconvertStudentList(ProceedingJoinPointjoinPoint){

//System.out.println("Convert之前");

Object[]args=joinPoint.getArgs();

Objectobj=null;

Listnewlist=null;

try{

obj=joinPoint.proceed(args);

Listold=(List)obj;

newlist=(StudentConverter.convert2StudentList(oldlist));

}catch(Throwablee){

e.printStackTrace();

}

//System.out.println("Convert之后");//方法执行后的代理处理

returnnewlist;

}

@Around(Student)

publicStudentconvertStudent(ProceedingJoinPointjoinPoint){

//System.out.println("Convert之前");

Object[]args=joinPoint.getArgs();

Objectobj=null;

StudentnewsStudent=null;

try{

obj=joinPoint.proceed(args);

newsStudent=StudentConverter.convert2Student(obj);

}catch(Throwablee){

e.printStackTrace();

}

//System.out.println("Convert之后");//方法执行后的代理处理

returnnewsStudent;

}

//generator-insert-location

}

最后,由StudentDao方法返回的代理类和集合属性在序列化到flex端之前,都被拦截,进行转化后,可以正常序列化了。

http://archive.cnblogs.com/a/1843018/

相关推荐