簡體   English   中英

休眠多對一外鍵未設置

[英]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建議正確。 有兩種解決方法:

  1. 刪除注釋:去除所述雙向關系@ManyToOne(optional = false, fetch = FetchType.LAZY)simpleAliasMaskSampleAliasMaskPart

  2. 通過執行類似於component.setSimpleAliasMask(mask)mask添加到每個component 這將建立雙向關系。

暫無
暫無

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

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