[英]Hibernate many to one foreign key not getting set
我的關系很簡單
[SampleAliasMask] has many [SampleAliasMaskPart]
我的問題是 ,當我使用集合部件持久保存SampleAliasMask的新實例時,遇到約束沖突,即從SampleAliasMaskPart表到SampleAliasMask的外鍵鏈接被設置為NULL。
我正在使用休眠注釋進行映射,例如:
@Entity
@Table(name="SAMPLE_ALIAS_MASK")
public class SampleAliasMask extends ClientEntity {
@OneToMany(mappedBy = "sampleAliasMask", fetch = FetchType.EAGER, cascade = javax.persistence.CascadeType.ALL, orphanRemoval = true)
@Cascade(CascadeType.ALL)
@Length(min = 1, message = "The sample alias mask must have components")
private Set<SampleAliasMaskPart> components;
關系的另一半映射為:
@Entity
@Table(name="SAMPLE_ALIAS_MASK_PART")
public class SampleAliasMaskPart extends ClientEntity {
@ManyToOne(optional = false, fetch = FetchType.LAZY)
@JoinColumn(name = "SAMPLE_ALIAS_MASK_ID", nullable = false)
private SampleAliasMask sampleAliasMask;
ClientEntity的相關部分是
@MappedSuperclass
public abstract class ClientEntity {
@Id
@Column(name="ID")
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
我正在創建這樣的部分:
HashSet<SampleAliasMaskPart> components = new HashSet<>();
for(Map<String, Object> c : this.components) {
SampleAliasMaskPart component = new SampleAliasMaskPart(Integer.parseInt(c.get("value").toString(), 10), c.get("name").toString());
result.validate(component);
components.add(component);
}
mask.setComponents(components);
我得到的確切錯誤是:
java.sql.BatchUpdateException: ORA-01400: cannot insert NULL into ("ST"."SAMPLE_ALIAS_MASK_PART"."SAMPLE_ALIAS_MASK_ID")
我懷疑問題與以下事實有關:我從未明確設置SampleAliasMaskPart.sampleAliasMask,但為什么我需要這樣做? 這種關系永遠不會被揭露或瀏覽。 該字段僅用於映射目的,這使我認為我正在映射此錯誤。
您的假設是正確的。 Hibernate使用關聯的擁有方來知道該關聯是否存在。 而擁有方是沒有mappedBy屬性的一方。
一般規則是,當您具有雙向關聯時,您有責任通過初始化/修改關聯的兩側來使對象圖保持一致。 Hibernate不太關心它,但是如果您不初始化擁有方,它將不會持久化關聯。
請注意,您不必強制將此關聯設為雙向。 如果不這樣做,則將零件添加到蒙版就足夠了,因為這一面(這是唯一面)是擁有面。
JB Nizet建議正確。 有兩種解決方法:
刪除注釋:去除所述雙向關系@ManyToOne(optional = false, fetch = FetchType.LAZY)
從simpleAliasMask
在SampleAliasMaskPart
通過執行類似於component.setSimpleAliasMask(mask)
將mask
添加到每個component
。 這將建立雙向關系。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.