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字段值。
我在插入接收到此消息:
試圖保存有未保存的臨時實體不可爲空 協會
我明白爲什麼我收到一個或多個實體這個消息,我也可以從數據庫中得到目錄行,但這意味着我每次插入一個子行時都必須查詢所有父項,這在所有設計上都沒有意義,因爲我真的只是用外鍵插入一行引用。
有誰知道如何防止這種行爲?
我最初想要通過休眠生成數據庫DDL,我仍然試圖使它的工作方式。當我從數據庫中選擇一個產品時,我也希望該目錄能夠被熱切地獲取。但是,如果我插入產品,我只希望將catalogId插入產品行中,而無需爲目錄部分執行額外的選擇。 –
對我來說,它似乎是一種非常非常標準的功能。我想在選擇時進行熱切獲取,但我只想插入產品實體,並且如果目錄不存在,讓數據庫強制實施外鍵約束。 –
我試過你的建議,它解決了這個問題。通過保持與Catalog的ManyToOne關係(使用insert和update = false)並添加catalog_id字段,我現在只能通過僅擁有父關係的id來插入產品實體。儘管如此,在實體中有重複(同時擁有catalog.id和catalod_id字段)可能會導致長期的問題,但它比在插入上做多個無用的選擇要好。 –