2

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

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

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

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

请问有什么想法吗?

4

3 回答 3

3

作为替代方案,您可以考虑使用GraniteDS代替 BlazeDS:GraniteDS 具有比 BlazeDS 更强大的数据管理堆栈(它与 LCDS 竞争更激烈)并且完全支持所有主要 JPA 引擎的延迟加载:Hibernate、EclipseLink、OpenJPA 等.

此外,GraniteDS 具有出色的客户端透明延迟加载功能,甚至还有所谓的反向延迟加载机制。

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

于 2012-04-20T15:25:06.350 回答
2

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

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

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

于 2012-04-13T13:45:59.647 回答
0

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

如果您有一个分离的对象,您也可以将不需要的字段清空,或者使用 DTO。

于 2012-04-25T13:54:13.170 回答