Spring REST和现实世界的对象图

时间:2015-12-05 14:35:04

标签: spring rest spring-data-jpa

我已经阅读了这个spring-data-rest教程https://spring.io/guides/gs/accessing-data-rest/,我无法看到如何在我们没有一个对象的真实世界情况中应用它,而是一个对象图

假设我们有一个Order对象,它与Item之间具有一对多关系,该对象按Category对象进行分类。让我们说,为了它,类别是以树状结构实现(所以它有一个父母和一些孩子;即一个电子类别可能有2个孩子,电脑和电视,前者有另外两个孩子,主板和键盘)。 让我们说所有这些关系都是两种方式(即一个订单可以看到它的项目,一个项目可以访问它的订单)

因此,当我请求Order对象抛出我的REST服务时,我已经离开了订单,所有它的项目和每个项目将具有Category的整个图形,它将链接到每个项目,从而链接到所有订单。所以我基本上都在返回整个数据库。

我确实理解双向关系并不理想,但即使我们压制关系的多方面,在申请订单时,我们仍会得到 订单项目类别 - 父类别 - 父类别的父母 - 等...

那么如何停止被序列化的对象图?

此外,您可能不希望在修复点处破坏图形。 例如,当我请求订单时,我可能希望看到它的项目和每个项目的类别,但绝对不是父项的类别。 但是,当我想明确显示一个类别时,我希望看到它的父类。得到它?

有人对我有一些见解吗?

1 个答案:

答案 0 :(得分:0)

这是DTO的好处。 :)

您构建所需的对象结构并通过json返回它。你可以完全控制这个结构,你没有双向关系,你可以把它作为控制器中的对象图给出。

另一个(好的)副作用是你分离持久性并完全查看。我们都可以独立发展。

一个(负面)副作用可能是增加维护。您至少有两次要维护的类,以及两者之间的映射。像JList这样的框架至少可以帮助您进行映射。

另一种解决方案可以是为Dozer实现一些插件来处理所有这些情况,而无需DTO。 我自己创建了Antpath过滤器来动态决定在Jackson中过滤掉哪条路径: https://github.com/Antibrumm/jackson-antpathfilter

但是如果您想直接使用域实体,还需要考虑更多的事情。

  • 循环断路器(例如,避免双向关系)
  • 视图模式中的延迟加载/打开会话,因为序列化可以随处可见
  • 具有不可序列化(会话)的方法的hibernate代理