2017-04-17 53 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