如何在没有支持存储库的情况下对依赖实体执行 POST

How to do POST on a dependent Entity without a backing Repository

我发现在 Spring 的很多答案中都提到了与 "Aggregate Root" 和 "Entity" 以及 "Value Objects" 的 Data Rest 设计相关的问题以及 "Value Objects"。

而且我认为存储库等同于聚合根。

案例 1

我的问题是关于这个的,假设有 2 个实体 - User 和 UserSettings,在数据库中表示为 2 个表,UserSettings 有一个指向 User 的外键 user_id。

在这种情况下,我想对 User 和 UserSettings 都进行 GET/POST。从一些帖子中,我发现存储库应该处于聚合根级别,这意味着在这种情况下只为用户公开存储库,因为 UserSettings 完全取决于用户。

现在,我有 2 个具有双向关系的存储库,每个存储库一个,即 UserRepository 和 UserSettingsRepostory,都公开为 REST 服务。

因此,我在 UserSettings 和用户

上执行 POST
/app/userSettings
/app/users

对于,我用于 UserSettings 和用户的 GET -

/app/users/{id}/userSettings
/app/users/{id}

如果我不公开 UserSettingsRepository ,什么将等同于 /app/userSettings 上的 POST,我目前正在做的事情如下 -

Method - POST
Input JSON - {
"user" - "/app/users/{id}",
..
}

案例 2

同样,如果有以下 Entities/Tables - User、UserPost 和 UserComment - 这里 UserComment 有 2 个外键作为 UserPost 和 User。

我想这里我们有 2 个聚合根,因此应该有 2 个存储库,如 UserRepository 和 UserPostRepository。

另一种思考方式是,既然所有的一切都依赖于用户,所以我们只能有一个 UserRepository 的存储库。

在这里,与我什至拥有 UserCommentRepository 的当前状态相反,我不确定如何在删除它后对 UserComment 执行 POST。

如果您想单独与 UserSettings 交互,它们需要成为专用资源,这意味着它们不再是 User 集合的一部分。聚合通过确保没有其他人操纵它的各个部分的状态来确保某些断言包含在自身内部。所以如果你想做后者,聚合就不再是聚合了。 Spring Data REST 只是在 HTTP 级别公开了这些概念。

要将 UserUserSettings 放在一起,您基本上有两个选择:

  • 通过添加 link 为用户资源引入专用状态转换。为指向的资源定义支持的 HTTP 动词和数据结构。
  • 对用户资源使用 HTTP PATCH 操作来操纵部分资源。