0

我正在开发一个 RESTish Web 服务。我想我明白了聚合和组合之间的区别。聚合不会对其引用的对象强制执行生命周期/范围。组合确实对它包含/拥有的对象强制执行生命周期/范围。

如果我删除一个复合对象,那么它包含/拥有的所有对象也会被删除,而删除聚合根不会删除引用的对象。

1) 如果删除聚合根确实不需要删除引用的对象,那么没有引用对象的存储库有什么意义?还是聚合根是指所谓的复合对象的术语?

2) 当您创建一个 Web 服务时,您将有多个端点,在我的例子中,我有一个实体Book和另一个名为Comment. 如果这本书被删除,在我的应用程序中留下评论是没有意义的。因此,书是一个复合对象。我想我不应该一个评论存储库,因为这会破坏生命周期和书籍类可能拥有的规则的执行。但是我有 URL,例如(仅示例):

GET /books/1/comments
POST /books/1/comments

现在,如果我没有评论存储库,这是否意味着我必须加载 book 对象然后返回引用的评论?我是否可以从 BookRepository 返回评论实体列表,这有意义吗?Book 的存储库最终可能会随着各种方法变得相当大。我是否允许编写针对评论而不是存储库内书籍的 JPQL(JPA 查询)?评论的分页和过滤呢?添加由 POST 端点触发的新评论时,是否需要加载图书,将评论添加到图书,然后更新整个图书对象?

我目前正在做的是拥有自己的 CommentRepository,即使评论已随书一起删除。我可能需要一些关于如何正确执行的指导。由于您不仅要在 RESTish 服务中公开根对象,我想知道如何在后端处理这个问题。

我正在使用 Hibernate 和 Spring。

4

1 回答 1

0

您的 REST 资源不必与您的 JPA 实体完全匹配。即使您不打算将评论作为根 REST 资源公开,有时将其建模为 JPA 实体并为其提供存储库仍然是有意义的。支持这一点的几点:

  • 如果您预计一本书会有大量评论,那么通过将评论添加到Book.comments收藏中来保存评论可能效率很低。
  • Comment当是一个实体并有自己的 ID 时,编辑和删除评论会容易得多。
  • Comment如果是一个值对象,分页实现可能会非常低效。

我会做的是:

  • 两个实体:BookComment
  • 数据库中的一个外键,可确保一本书被删除时所有评论都被删除。
  • 每个实体的存储库。CommentRepository会有一个方法findByBook()
  • REST 接口中的 /book/{id}/comments
于 2013-10-03T18:45:54.600 回答