java - 如何处理M :M entity relationships in Flex/Java web application?

标签 java apache-flex hibernate blazeds jpa-2.0

我正在努力想出一种高效管理 Flex 实体的方法,这些实体在其 JPA/Java 对应部分之间具有多对多关系。

这就是问题所在...想象一个具有两个实体的电影评论 Web 应用程序:

@Entity
Class Movie {
 List<Viewer> Viewers;
}

@Entity
Class Viewer {
 List<Movie> Movies;
}

这两个实体可以彼此独立存在,并且彼此之间具有 1:M 的关系。这种关系并不真正属于一方或另一方。

在该应用程序中,有一些 Flex UI 有时希望根据电影查看观众,而其他 UI 则希望根据观众查看电影。

目前 Movies.ViewersViewers.Movies 集合都是由 JPA 延迟加载的,效果很好。问题是每次我向观众询问它的电影列表时,它们都会通过网络发送,然后在 Flex 中我最终会得到一堆电影对象(通常,并非总是)复制我已经拥有的对象那里。

充其量看起来效率很低,如果不处理重复的对象,可能会导致错误。

在我的实际应用程序中,我在一些非常大的对象图中有大量此类关系。

在我看来,延迟加载的对象集合几乎需要转变为急切加载的外键集合,这些外键用于在事物的 Flex 端显式加载对象。但这似乎是我在用 Flex 编写 JPA 提供程序!从不在 Flex 应用程序中存储状态的正确答案是什么? (哎呀)救命!!

更新:

我应该补充一点,我所有的值对象都有一个在服务器端创建的 UID,因此我可以以某种方式使用它来查找/删除 Flex 端的重复项。但是如何呢?

最佳答案

对于后端返回内存中已有的相同对象的新实例,您无能为力。尽管在搜索和过滤时,让多个实例引用相同的实体(基于值,而不是内存位置)可能会导致一些意外的结果。这是因为 2 个不同实体上的简单 === 对于看似相同的实体并不总是正确的,因为它们指的是内存中的 2 个不同对象。

我建议向您的实体添加自定义相等方法,而不是依赖 ===。在实体的情况下,相等性将基于 id,这很可能也是数据库 id。对于值对象,相等性基于对象的状态。

此外,我不会尝试在客户端保留太多状态。我知道这似乎是一个有吸引力的解决方案,并且它在某些 Flex 架构框架中得到推广,因为毕竟您正在构建一个富客户端,但根据我的经验,这会导致许多数据过时的情况并进一步导致问题在路上。除非您正在使用托管数据(如在 LCDS 中),否则我宁愿查询后端而不是使用客户端状态。

最后一点:在我看来,m-m 关系是一个数据库实现细节,不应该被翻译成客户端和服务器的域。我更愿意创建由观众查询电影的服务方法,反之亦然。 Eric Evans 的 DDD 著作中有一些关于这个主题的好 Material 。

关于java - 如何处理M :M entity relationships in Flex/Java web application?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4504823/

相关文章:

java - hibernate:如果父层是新的,则不会将更新级联到子层

java - JComboBox 下拉列表中的 JPanel 但不在编辑器中

java - 调试挂起的进程

java - 我如何在java中比较两个JSONArray?

php - 使用 PHP 作为后端的 Flex Remoting 问题

apache-flex - 发布版本的 mxmlc 属性

java - 验证期间未使用 Spring MessageSource

java - 如何在 Mac 上使用较新的 JRE 或 JDK 运行 Android Studio?

java - 使用 Socket 将 Android 应用程序(带 Flex)连接到 Java 服务器?

java - 没有适用于 OSGi 应用程序的 'javax.persistence.EntityManagerFactory' 类型的合格 bean