2017-04-17 20 views
0

我有一个spring boot rest api。我在概念上有两个名为Venue和Address的实体,其中一个Venue必须有一个Address。 我的问题是我必须首先发布Address实体,然后使用Address实体的自链接发布我的Venue实体。 直到我开始编写我的浏览器客户端,这似乎没问题。我不喜欢这样一个事实,即如果地址一直持续到数据库,在场地持续之前发生了某些事件会中断用户连接,那么最终会在数据库中产生一个垃圾实体,因为它不会关联与任何东西。我可以通过删除刚才创建的地址来编写我的客户端来回滚,但如果我的api被第三方使用,那么我遇到了问题。 有什么办法可以在发布父实体的同时发布我所有的子资源数据? 如果没有,是否有任何共同的策略扫除孤立记录?POST实体及其子资源作为一个事务OR孤儿删除策略

+0

连接恢复后用户是否会再次添加相同的地址,导致DB中的地址相同?还是担心他们永远不会继续添加Venue,因此他们已添加的地址是无用的? –

+0

担心的是,他们不会继续添加场地,以便已经创建的地址是无用的 – gezinspace

+0

,因为当他们再次尝试时,他们将一起提交所有相关数据,它只会创建一个新地址,这很好,但地址已经创建的还在那里。 – gezinspace

回答

0

这里有几个选项来思考。

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

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

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

+0

好的谢谢,即时通讯与我认为的第一个选项去。 – gezinspace