2016-10-11 109 views
0

我試圖從表中刪除子項,我的實體擁有2路的關係。我收到了一個異常「無法刪除或更新父行:外鍵約束失敗」。 我需要映射當我刪除與父母的子條目關係自動丟棄。JPA:不能刪除或更新父行

@Entity 
@Table 
public class RuleModel implements Comparable<RuleModel> { 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(name = "Rule_Id", unique = true, nullable = false) 
    protected Integer id; 

    @OneToOne(fetch = FetchType.EAGER) 
    protected RuleModel parent; 

    @OneToOne(fetch = FetchType.EAGER) 
    protected RuleModel child; 
} 
+0

您需要設置CASCAD降:http://stackoverflow.com/questions/ 306144/jpa-cascadetype-all-does-not-delete-orphans – Zorglube

+0

但我不想刪除我的父項。 – Hammad

+0

對於你的情況,也許'父'和'孩子'都引用同一個對象。請檢查您的代碼。 –

回答

0

您必須在刪除孩子之前打破對象之間的關係。

0

我設置刪除前塊雙方父母和孩子空,因此冬眠第一個更新的關係爲空,然後刪除

@PreRemove 
public void preRemove() { 

    if (parent != null) { 
     parent.setChild(null); 
    } 
    if (child != null) { 
     child.setParent(null); 
    } 
} 
+1

您的設計容易出錯。您並不需要像在數據庫中那樣分開存儲父母和孩子。只要把它們看作是兩個方向相同的關係就會更好,這意味着只需將「父」存儲在數據庫中,並將其映射到實體中即可。對於孩子關係,使用'mappedBy'。並且,在您的域邏輯中執行這些操作,而不是依靠'@ PreRemove'。雖然你現在可以刪除這個東西,但你的父母現在指着沒有孩子,而你的孩子沒有父母,這對我來說看起來有些數據不一致。 –

+0

我正在建設2路鏈接列表 – Hammad

+0

那麼?實際上更糟糕。如果您從雙向鏈表中刪除一個節點,則其prev的下一個應該指向節點的下一個,並且其下一個的prev應該指向節點的prev。你所做的只是簡單地破壞列表。而且,我在prev評論中所說的內容與您正在嘗試做的事情沒有矛盾。在數據庫中,您只需要存儲父ID,並且在您的實體模型中,您可以像現在正在做的那樣擁有該關係的兩個方向 –

相關問題