Flex Blaze DS和JPA - 延迟加载问题

时间:2012-04-13 12:47:00

标签: java flex reflection jpa blazeds

我正在Flex中开发一个应用程序,使用Blaze DS与Java后端进行通信,后端通过JPA(Eclipse Link)提供持久性。

通过Blaze DS将JPA实体传递给Flex时遇到问题。 Blaze DS使用反射通过调用实体上的所有getter方法将JPA实体转换为ObjectProxy(实际上是HashMap)。这包括任何延迟初始化的一对多对多关系。

你可能会看到我要去的地方。如果我通过JPA传递单个对象,这将调用此对象上的所有一个/多对多方法。对于每个返回的对象,如果它们具有一个/多对多关系,它们也将被调用。因此,通过传回一个JPA实体,我实际上最终会进行多个数据库调用并将所有相关条目作为单个ObjectProxy实例传回!

我迄今为止的解决方案是创建一个转换器,将每个实体转换为ObjectProxy,反之亦然。这显然很麻烦,必须有更好的方法。

请问?

3 个答案:

答案 0 :(得分:3)

作为替代方案,您可以考虑使用GraniteDS而不是BlazeDS:GraniteDS比BlazeDS具有更强大的data management堆栈(它与LCDS竞争更多)并且完全支持所有主要的延迟加载JPA引擎:Hibernate,EclipseLink,OpenJPA等。

此外,GraniteDS具有出色的客户端transparent lazy loading功能,甚至还有一个所谓的reverse lazy-loading机制。

并且您不需要任何类型的中间DTO:它按原样序列化JPA实体,并在客户端使用代码生成的ActionScript bean来保持其初始化状态。

答案 1 :(得分:2)

不幸的是,使用Flash客户端不容易实现延迟加载。有一些工作解决方案,如dpHibernate,但到目前为止,我测试的所有不同解决方案都达不到您在性能和易用性方面的预期。

根据我的经验,这是始终使用DTO的最佳和最可靠的解决方案,这增加了干净地分离数据库和视图层的好处。但是,这需要您实现急切加载或第二次服务器往返以解决您的多对多关系,以及更多的样板代码来复制DAO和DTO字段值。

选择哪一个取决于您的使用案例:有时仅获取主要对象的字段就足够了,那么您可以简单地省略DTO中相关对象的列表(仅传输您需要的那些值)查询)。有时您实际上可能需要整个相关实体列表,然后您可以通过急切加载或通过设置第二个远程对象来仅查找列表来获取它。

答案 2 :(得分:0)

EclipseLink还提供了一个copyObject()API,允许您提供一个具有所需属性的副本组。然后,您可以使用此副本来避免拥有您不想要的关系。

如果你有一个分离的对象,你可以省略你不想要的字段,或者使用DTO。