最近在搞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:
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 :
@Aspect
public 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端之前,都被拦截,进行转化后,可以正常序列化了。
转自http://67566894.iteye.com/blog/686601
http://archive.cnblogs.com/a/1843018/
分享到:
相关推荐
本文将深入探讨几种解决Flex与Hibernate延迟加载问题的方法,并着重讲解使用Gilead的方案。 1. **LCDS的Hibernate Adapter**:Adobe LiveCycle Data Services (LCDS) 提供了一个Hibernate适配器,可以处理延迟加载...
本文将围绕Flex框架下的延迟加载技术展开讨论,包括其概念、应用场景、常见问题及解决方案,并提供一个简单的实现案例。 #### 二、Flex简介 Flex是一个开源框架,由Adobe Systems发布,用于构建和部署丰富的...
Flex、Hibernate 和 Spring 是三个在IT行业中非常重要的技术框架,它们分别在用户界面、持久化层和应用架构方面发挥着关键作用。让我们深入探讨一下这三个技术的整合以及如何实现它们的详细配置。 Flex 是 Adobe ...
flexBulider页面加载动态图片的显示
在IT行业中,Spring、Hibernate和Flex是三种非常重要的技术,分别用于不同的领域。Spring是一个全面的Java企业级应用开发框架,Hibernate是一个强大的对象关系映射(ORM)框架,而Flex则是一种用于创建富互联网应用...
Flex和Hibernate的整合是将富客户端的Flex技术与持久层框架Hibernate相结合,以实现更高效、功能丰富的Web应用。在Flex前端,用户可以享受到交互性强、图形化展示丰富的界面,而Hibernate则负责在后台处理数据库操作...
在本文中,我们将深入探讨“Flex CSS动态加载”这一主题,这是前端开发中一个非常重要的概念,尤其是在构建响应式和高性能的Web应用时。Flex CSS允许我们动态地改变页面布局,根据用户行为或屏幕尺寸调整元素的位置...
《Flex 4.5与Spring 3、Hibernate整合的实战解析》 在现代Web开发领域,Flex作为一款强大的富互联网应用程序(RIA)开发框架,以其丰富的用户界面和强大的数据交互能力受到广泛青睐。本项目实例——"FSH.rar",正是...
这种组合在企业级应用开发中非常常见,因为它提供了从前端到后端的完整解决方案。 在博文链接中,作者可能分享了关于如何整合这些框架进行开发的经验,或者提供了示例代码和配置方法。不过由于实际链接未给出,无法...
Flex和Hibernate是两种在开发Web应用程序时常用的工具。Flex是一种基于Adobe Flash Player或Adobe AIR运行时的富互联网应用(RIA)开发框架,主要用于构建交互性强、用户体验良好的前端用户界面。而Hibernate是一个...
Flex和Hibernate是两种在开发Web应用程序时经常使用的技术。Flex是一种用于构建富互联网应用程序(RIA)的客户端技术,由Adobe公司开发,它基于ActionScript和Flash Player或Adobe AIR运行环境,提供丰富的用户界面...
预加载是任何富媒体应用程序的关键部分,因为它确保了所有必要的资源在应用程序启动时已经完全加载,从而避免了在运行时出现延迟或卡顿。在Flex中,预加载器通常用来显示加载进度,同时隐藏可能由于大文件加载而产生...
本文将深入探讨如何在 Flex 中动态加载 Image 和 Icon,这对于创建响应式和灵活的应用程序至关重要。动态加载资源可以显著提高应用程序的性能,减少启动时间和内存消耗。 在 Flex 中,我们可以使用 `Loader` 类来...
本方案将详细探讨如何在Flex项目中实现完美的多语言支持,以满足i18n(国际化)的需求。 首先,我们需要了解什么是i18n。i18n是“国际化”的缩写,这里的数字18代表英文单词"internationalization"中的字母数量。这...
标题提到的问题是“解决Flex4无法加载设计模式APE补丁”,这涉及到的是Adobe Flex开发环境在MyEclipse8.5中的一个常见问题。Flex是一个用于创建富互联网应用程序(RIA)的框架,而MyEclipse则是一个集成开发环境...
Flex+Struts2+Hibernate是Java Web开发中的经典技术栈,用于构建富互联网应用程序(RIA)。这个例子展示了如何将这三种技术结合起来实现一个基础的CRUD(创建、读取、更新、删除)应用,其中Flex作为前端展示层,...
它可以避免一次性加载所有数据导致的延迟,提供更流畅的用户体验。 #### 2. 动态加载策略 除了简单的展开/折叠操作外,还可以考虑更加复杂的动态加载策略,例如按需加载、缓存机制等。 #### 3. UI反馈 为了提供更...
偌大的一个csdn竟然都没有发现一个完整的整合版flex,spring,hibernate。无奈之下自己经过一个半的努力实现了flex调用springAOP管理的java方法,项目中也有我写好的hibernate方法。
本文主要讲解了如何将Adobe Flex、Spring和Hibernate这三种技术进行整合,构建一个强大的前端与后端交互的Web应用程序。 首先,我们要理解这三个技术的基本概念。Flex是一种用于创建富互联网应用程序(RIA)的前端...
Flex+Spring+Hibernate示例是一种常见的企业级应用架构,它结合了Adobe Flex前端技术、Spring后端框架和Hibernate持久层框架,以构建高效、灵活且易于维护的Web应用程序。在这个示例中,开发者可能已经展示了如何...