2017-04-03 98 views
0

我想插入一個新的子記錄,其中父關係已經存在於數據庫中,而不必先通過查詢獲取父項,然後插入新子項。Hibernate在不插入父項的情況下保存子實體

例子:我有一個產品的實體,誰擁有與現有的目錄實體多對一:

@NotNull 
@ManyToOne(fetch = FetchType.EAGER) 
@JoinColumn(name = "catalog_id", 
    referencedColumnName = "id", foreignKey = @ForeignKey(name = "FK_product_catalog")) 
private Catalog catalog; 

我希望能夠插入目錄的新產品,而無需先查詢該目錄填寫新產品實體。

實際上,我在restController中的POST中接收到json,Json包含產品屬性和目錄標識。

這裏是JSON:

{ 
    "id":1, 
    "attribute1":"value", 
    "catalog":{"id":1} 
} 

一旦序列發生時,產品實例是正確形成含目錄的一個實例,其只有id字段值。

我在插入接收到此消息:

試圖保存有未保存的臨時實體不可爲空 協會

我明白爲什麼我收到一個或多個實體這個消息,我也可以從數據庫中得到目錄行,但這意味着我每次插入一個子行時都必須查詢所有父項,這在所有設計上都沒有意義,因爲我真的只是用外鍵插入一行引用。

有誰知道如何防止這種行爲?

回答

0

爲什麼不爲catalog_id創建單獨的屬性,並將@NotNull約束放在那裏而不是Catalog對象屬性?

+0

我最初想要通過休眠生成數據庫DDL,我仍然試圖使它的工作方式。當我從數據庫中選擇一個產品時,我也希望該目錄能夠被熱切地獲取。但是,如果我插入產品,我只希望將catalogId插入產品行中,而無需爲目錄部分執行額外的選擇。 –

+0

對我來說,它似乎是一種非常非常標準的功能。我想在選擇時進行熱切獲取,但我只想插入產品實體,並且如果目錄不存在,讓數據庫強制實施外鍵約束。 –

+0

我試過你的建議,它解決了這個問題。通過保持與Catalog的ManyToOne關係(使用insert和update = false)並添加catalog_id字段,我現在只能通過僅擁有父關係的id來插入產品實體。儘管如此,在實體中有重複(同時擁有catalog.id和catalod_id字段)可能會導致長期的問題,但它比在插入上做多個無用的選擇要好。 –

相關問題