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

时间:2015-01-26 10:35:54

标签: spring spring-data spring-data-rest

我发现Spring Data Rest设计相关问题的许多答案都提到“聚合根”和“实体”以及“价值对象”。

我认为Repository等同于Aggregate Root。

案例1

我的问题是围绕这个,比如有2个实体 - 用户和用户设置,在数据库中表示为2个表,而UserSettings有一个指向User的外键user_id。

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

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

因此,我在UserSettings和User上进行POST

/app/userSettings
/app/users

对于,GET我用于UserSettings&用户 -

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

如果我没有公开UserSettingsRepository,那么/app/userSettings上的POST将等同于我目前正在执行的操作 -

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

案例2

同样,如果有以下实体/表 - User,UserPost和UserComment - 这里UserComment有2个外键,如UserPost和User。

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

另一种思考方式是,因为所有这些都依赖于用户,所以我们只能为UserRepository创建一个存储库。

在这里,与我目前处于UserCommentRepository状态的状态相反,我不确定如何删除它后如何在UserComment上执行POST。

1 个答案:

答案 0 :(得分:1)

如果您想单独与UserSettings互动,则需要成为专用资源,这意味着他们不再是User聚合的一部分。聚合通过确保没有其他人操纵其部分状态来确保某些断言在其自身内部。因此,如果您想要执行后者,则聚合不再是聚合。 Spring Data REST只是在HTTP级别公开这些概念。

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

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