[英]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.