我们的应用程序中包含以下概念(由UI和REST后端组成):
Container
是lineItem
s的父母
如果没有有效的lineItem
就无法创建Container
,并且这两个实体都通过spring数据保存在DB中。
UI在两页中列出了lineItem
s
lineItem
的Container
slineItem
s的Container
s我们为这两个UI页面提供了单一的数据源。数据来自一个通用的REST后端,它返回一个包含在POJOview对象中的lineItem
s列表(以及其他信息) - 当前状态。
需要更改 - 在搜索页面上,现在,我们需要显示来自Container
的lineItem
的一些信息。所以,现在我们需要在搜索页面上提供与Container
相关的lineItem
的数据。我们目前正在讨论两种可能的方法:
方法1:POJOview {
List<LineItem>
List<Container>
}
List<LineItem>
和List<Container>
是单独发送的,因此,更少的数据被传输到UI。如果发送属于1个lineItem
的20个Container
s,那么Container
中只有一个对象与方法2中的20个Container
对象相比。lineItem
映射到其他列表中的Container
方法2:POJOview {
List<LineItem> //insert Container of a lineItem as a member variable in the lineItem itself. Container instance is annotated with @Transient to avoid persistence in DB.
}
lineItem
现在包含与域概念相反的Container
(Container
是lineItem
s的父亲),因此它不直观并且使代码难以理解和保持。lineItem
现在包含Container
,所以,如果我们在属于同一个lineItem
的页面上有20个Container
s,那么Container
数据现在是lineItem
的一部分被加载20次(性能命中)问题在于,尽管存在所有这些事实,我的同事仍然认为方法2是最佳方式,因为它是一个快速解决方案,并且他认为没有任何错误。我在这里错过了什么吗?
根据我的观点,实施的一个好方法如下:
REST服务可以按以下格式返回数据:
a)LineItem对象列表,其中每个LineItem对象只包含其容器的ID(注意:它不是一个错误的方法,因为只要父数据不重复,子对象就可以很好地包含对其父对象的引用)每个孩子)。 b)容器对象列表。显然,只应返回行项引用的那些容器。
前端逻辑可以遍历订单项列表,并在容器列表中查找容器详细信息。
数据项a)和b)可以通过单独的呼叫或单个呼叫发送。理想情况下,如果要严格遵循REST原则并使两个调用不影响性能,则应进行两次单独调用,因此根据REST原则,LineItem资源在一次调用中检索,而Container资源在另一次调用中检索。
通过使用这种方法,不重复容器信息,在行项目对象中仅重复容器ID,在大多数情况下这应该是可以的。
因此,除了lineitems可以包含其父项(容器)的ID之外,这种方法基本上与您描述的方法1)类似。
根据我的理解,问题中提到的方法2重复每个lineitem对象的完整容器信息,这绝对是错误的。无论是从DB检索数据还是在后端传递数据或者将数据发送到前端,都可以重复ID而不是完整对象。
希望这提供了一些清晰度。