Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Flex/JavaWeb应用程序中处理M:M实体关系?_Java_Apache Flex_Hibernate_Blazeds_Jpa 2.0 - Fatal编程技术网

如何在Flex/JavaWeb应用程序中处理M:M实体关系?

如何在Flex/JavaWeb应用程序中处理M:M实体关系?,java,apache-flex,hibernate,blazeds,jpa-2.0,Java,Apache Flex,Hibernate,Blazeds,Jpa 2.0,我正在努力找到一种方法来有效地管理Flex实体,这些实体在JPA/Java计数器部件之间有多对多关系 问题就在这里……想象一下一个电影评论web应用程序有两个实体: @Entity Class Movie { List<Viewer> Viewers; } @Entity Class Viewer { List<Movie> Movies; } @实体 班级电影{ 列出观众名单; } @实体 类查看器{ 列出电影; } 这两个实体都可以彼此独立存在,并且彼此之间

我正在努力找到一种方法来有效地管理Flex实体,这些实体在JPA/Java计数器部件之间有多对多关系

问题就在这里……想象一下一个电影评论web应用程序有两个实体:

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

@Entity
Class Viewer {
 List<Movie> Movies;
}
@实体
班级电影{
列出观众名单;
}
@实体
类查看器{
列出电影;
}
这两个实体都可以彼此独立存在,并且彼此之间都有1:M的关系。这种关系实际上不是由一方或另一方拥有的

在应用程序中,有一些Flex UI有时希望基于电影观看者,而其他UI则希望基于电影观看者观看电影

目前,JPA延迟加载了
Movies.Viewers
Viewers.Movies
集合,效果良好。问题是,每次我向观众索要电影列表时,它们都会通过电线发送,然后在Flex中,我最终得到一堆电影对象,这些对象(通常,并非总是)与我已经在那里的对象重复

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

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

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

更新:


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

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

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

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


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

LCD试图通过使用数据管理为您解决这个问题-但是我不确定它是否仍在路线图上。因此,是的,通过使用直接的方法(尝试复制客户机上所有关系的模型),假设您有无限的时间,您可以在Flex中编写自己的实体管理器

在我的例子中,我正在使用BlazeDS,并且我已经开始为客户端创建更简单的对象。例如,如果我需要所有的电影,我会创建一个类似于MovieVO传输对象的东西,然后从电影列表中创建对象列表。根据规范,我将在MovieVO中添加更多信息(比如一个计算观众数量的变量,或者一个简化的观众列表)。基本上,我在客户机上简化了很多模型。缺点是我必须编写/修改许多粘合代码


我很想听到另一种方法,特别是来自使用weborb/graniteds的开发人员。

您是否确实验证过您的JPA提供商正在创建同一实体的多个副本?很可能在服务器端,您对同一副本有多个引用,这不是什么大问题。现在我毫不怀疑你通过电话发送时会收到多份副本。但是我不认为这个问题与JPA有关。你是对的,JPA很好,问题在Flex方面。每次在Flex中使用RemoteObject检索延迟加载的集合时,我都会让所有实体返回到Flex,但其中一些/大部分已经存在。所以它们在Flex端是重复的。我很幸运在每个对象上都有UUID。在所有值对象上添加我自己的ActionScript方法以实现相等是一个好主意。你知道有没有办法让ActionScript通过“==”操作符调用我的Equals函数?来自这里的Java背景……显然不是:目前,我正试图避免创建一组等距的DTO类(在这一点上感觉不太自信)。虽然这种方法意味着通过网络发送更少的属性(以及更少的远程服务调用),但我认为它不会减少通过网络发送的重复对象。我仍然存在这样的问题:ViewerVO对象下的MovieVO对象集合包含一个MovieVO,该MovieVO已经在另一个UI视图中,并且已经被修改,但尚未持久化。因此,我有两个相同电影的实例,具有相同的UID,但属性值不同。