POST实体及其子资源作为孤立删除的一个事务或策略

时间:2017-04-17 16:08:09

标签: spring rest spring-boot spring-data-rest orphan

我有一个弹簧靴休息api。我概念上有两个名为Venue和Address的实体,其中一个Venue必须有一个Address。 我的问题是我必须首先发布一个Address实体,然后使用Address实体的self链接POST我的Venue实体。 在我开始编写浏览器客户端代码之前,这似乎没问题。我不喜欢这样的事实:如果,一旦地址被持久化到数据库,在Venue持久化之前发生了破坏用户连接的事情我最终会在我的数据库中找到一个垃圾实体,因为它不会被关联有什么。我可以通过删除刚创建的地址来编码我的客户端以在这些情况下回滚,但如果我的api被第三方使用,那么我就遇到了问题。 有什么办法可以在POST主父实体的同时发布我所有的子资源数据吗? 如果没有,是否有任何共同的策略来清除孤立的记录?

1 个答案:

答案 0 :(得分:0)

以下是一些值得思考的选项。

如果相同的地址被POST两次,那么数据库中不应该有两条记录。确保这一点的方法是规范化地址输入,然后检查是否已添加该地址。如果已添加,则返回409冲突或200 OK。如果实际创建了新地址,则可以返回201 CREATED。您必须首先规范化数据,以便同一地址的多个变体不会导致多个条目。例如,当正常化时,转动所有“史密斯街”和“史密斯街”和“史密斯街”。进入“SMITH STREET”。您可以将此逻辑应用于地址中的所有字段。然后,您可以检查该地址是否已存在于数据库中。

如果这是太多的工作,那么考虑在数据库中没有Address是它自己的表/集合。也许只是让地址成为Venue的一个领域。如果在某些时候代码需要从Venue获取一个地址并将其放入自己的表中,那么当它出现时可以根据需要发生。

另一个想法是拥有一个服务,将Venue和Address作为输入。也许你可以称之为VenueRequest。该对象将包含两个主要字段,Venue和Address。该服务将完成将数据存储到地址然后存储到地点的工作。