Flex在前台的强大表现让越来越多的公司愿意使用Flex技术来开发应用界面。而Hibernate在数据持久层的表现就更不必说了,可以说,如果想要使用Flex作为前台界面,J2EE作为后台技术,那么hibernate是许多公司必选的框架,但是在真正使用的时候,往往会发现一些不兼容问题导致的各种问题,例如如果使用了BlazeDs作为Flex的数据源通讯框架,则会发现hibernate的延迟加载功能失效了。

hibernate的延迟加载功能是为了解决性能问题而提出来的,而所谓的延迟加载就是在需要数据的时候才进行数据加载的操作,而在不需要数据的时候不去进行必要的数据查询从而极大的避免了不必要的性能开销。Hibernate可以对数据对象、集合甚至数据的延迟加载。尤其是在使用多对多关联时,由于对象中使用了大量的集合,这时延迟加载对于性能的提升很明显。

但是在使用BlazeDs与后台通讯时我们会发现Hibernate将所有的对象属性都一次性全部查出来了,延迟加载失效了。这是由于BlazeDs的工作原理导致的,由于Flex作为客户端与一般的jsp程序最大的区别是:Flex的所有通讯操作都是异步通讯操作,而jsp程序是同步通讯的。也就是说当我们打开一个jsp页面程序时,是由JSP在后台生成了一个HTML页面返回给浏览器而呈现的,这样当我们不需要一些实体中的数据时,我们不会遍历到它,而Hibernate也就不必去数据库查询数据,因此延迟加载有效。但是Flex的所有操作都是异步通讯的,当Flex通过BlazeDs取数据时,BlazeDs需要将Java对象转换为AS中的对象,这时BlazeDs会遍历Java方法返回的对象,这样当BlazeDs遍历到对象中的集合时,Hibernate会将没有取出的数据查询出,Hibernate的延迟机制也就失效了。

 

既然明白了导致问题的原因,解决它也就有办法了。现在市面上流行的两种开源包可以解决这个问题:Gilead dpHibernate都是解决Hibernate延迟加载的有效方法,两种开源包实现原理也基本相同,都是在BlazeDs对Java对象进行遍历的时候将无需加载的对象设为null。此外,还有另外一种更加简便的方法,由于大部分在开发Flex-Java程序的时候都会使用的开源包有:BlazeDs-Spring-Hibernate,因此大都还会使用到Spring开源社区的Spring BlazeDs Integration,在其最新发布的1.5里程碑版中,已经提供了Hibernate延迟加载的解决方案。

需注意的是:如果使用Spring BlazeDs Integration 1.5M 来解决Hibernate的延迟加载,需使用BlazeDs 4 才行。