我正在努力想出一种高效管理 Flex 实体的方法,这些实体在其 JPA/Java 对应部分之间具有多对多关系。
这就是问题所在...想象一个具有两个实体的电影评论 Web 应用程序:
@Entity
Class Movie {
List<Viewer> Viewers;
}
@Entity
Class Viewer {
List<Movie> Movies;
}
这两个实体可以彼此独立存在,并且彼此之间具有 1:M 的关系。这种关系并不真正属于一方或另一方。
在该应用程序中,有一些 Flex UI 有时希望根据电影查看观众,而其他 UI 则希望根据观众查看电影。
目前 Movies.Viewers
和 Viewers.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/