2013-07-31 48 views
1

我有以下的單向多對一關係:多對一單向禁用約束

@Entity 
@Table(name = "Child") 
public class Child { 
    @Id 
    private Integer id; 

    @ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER) 
    private Parent parent; 
} 

@Entity 
@Table(name = "parent") 
public class Parent{ 
    @Id 
    private Integer id; 
} 

當我試圖從數據庫中刪除父實體我有約束衝突。

ORA-02292:誠信約束違反 - 子記錄發現

我需要的是即使有孩子是父母的實體被刪除,但兒童實體應該留下來。

我該如何改變這種關係?

回答

1

如果使用關係,則無法使用JPA。使其成爲ManyToOne表示外鍵字段中的值將存在於父表中。 JPA將無法區分null fk值和存在父表中沒有關聯行的fk值。

如果確實必須完成(而且它不應該是IMO),則需要將Child中的Integer外鍵值與基本映射(而不是ManyToOne)進行映射。這允許獨立於現有父實體設置它 - null表示空值,值表示值。然後,如果需要實體本身,則可以查詢關聯的Parent實體。

+0

對於傻問題抱歉 - 什麼是基本映射? – grass

+1

@基礎。這是非實體類型的默認映射 – Chris

0

ManyToOne上的可選= true參數可能會有幫助嗎?

@Entity 
@Table(name = "Child") 
public class Child { 
    @Id 
    private Integer id; 

    @ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER, optional = true) 
    private Parent parent; 
} 

我假設你直接從Hibernate創建模式。目標是讓外鍵字段在數據庫中可以爲空。

+0

默認情況下根據文檔 – grass

+1

是可選的啊,是的,好點 - 在任何情況下,這在刪除父項時都無濟於事。雖然有一個雙向關係(父側的OneToMany集合),但可以將每個子對象的父對象顯式設置爲null是否可以接受? – t6nn