簡體   English   中英

JPA / Hibernate使用共享ID和Cascade = all嘗試在父級之前保存子級,從而導致外鍵沖突

[英]JPA/Hibernate using shared id and cascade=all tries to save child before parent, causing foreign key violation

我在休眠狀態下使用JPA。 我有一對一的父子關系(該子項是可選的),其ID在兩者之間共享,並且在子表上具有外鍵關系。 我的實體看起來像這樣:

父母:

public class LogItemEntity {
...

    @OneToOne(cascade={CascadeType.ALL}, mappedBy = "logItem", orphanRemoval=true, optional=true)
    @PrimaryKeyJoinColumn(referencedColumnName="ral_id")
    private LogAdditionalRequirement additionalRequirement;
...
}

兒童:

public class LogAdditionalRequirement {
...
    @Id
    @GeneratedValue(generator = "foreign")
    @GenericGenerator(name = "foreign", strategy = "foreign", parameters = { @Parameter(name = "property", value = "logItem") })
    @Column(name = "ral_id")
    private Long id;

    @OneToOne(optional=false)
    @PrimaryKeyJoinColumn(referencedColumnName="id")
    private LogItemEntity logItem;
...
}

插入新對象時,父對象的ID由序列生成,並且級聯操作將其復制到子對象。 但是將子級的sql插入放在會話的操作隊列中,而父級的sql插入則放置在會話的操作隊列中,因此它失敗,並且外鍵受到約束沖突:

ERROR o.h.util.JDBCExceptionReporter - ERROR: insert or update on table "rar_log_additional_requirement" violates foreign key constraint "fk_rar_ral_id"
Detail: Key (ral_id)=(70150) is not present in table "ral_log".

那么我該如何首先插入父對象呢?

這一定是很常見的用法,所以我認為我做錯了什么,但我看不出它是什么。 我本來在子端具有mappingBy屬性。 我認為這是錯誤的,但是將其全部交換都沒有影響。

一種解決方案是刪除級聯“ cascade = {CascadeType.ALL}”

有關此主題的更多信息

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM