2014-01-07 146 views
0

我試圖刪除父列表而不刪除孩子的刪除父實體

父:

@Entity 
public class Parent { 
    @Id 
    @Column(name = "PARENTID") 
    private Long id; 

    @OneToMany(cascade = {CascadeType.ALL}, mappedBy = "parent") 
    private Set<Child> childs = new HashSet<Child>(); 

... 
} 

孩子:

@Entity 
public class Child { 
    @Id 
    @Column(name = "CHILDID") 
    private Long id; 

    @ManyToOne(cascade = CascadeType.ALL) 
    @JoinColumn(name="PARENTID", nullable = false) 
    private Parent parent; 

    ... 
} 

我確實是使用HQL查詢更新所有子級,然後使用HQL查詢來刪除父級的列表。

問題是這種方式太重了,有沒有簡單的解決方案使用jpa?

+0

您可以使用JPA批量更新來清除引用列表中父項的所有子項,然後批量刪除以刪除列表中的所有父項。這是你在HQL中做的嗎? – Chris

+0

你可以發佈你的代碼,首先更新,然後刪除? – Sashi

回答

0

映射,因爲它不允許父母與他們的孩子簡單刪除。它不支持在沒有Parentnullable = false)的情況下擁有Child

您可能需要

  • 去除父母之前設置父ID爲「代理」 Parent。您可以通過批量更新或者通過獲取即將被刪除的父母,迭代子代並重置父引用來完成。無論您使用批量更新還是對象操作取決於您如何移除父母。如果您使用批量查詢刪除父母,也可以爲孩子使用批量查詢。一般來說,我會使用對象方法作爲更安全的方法。批量查詢更緊湊。

  • 降低可空性約束並更改提供的級聯。從@OneToMany映射中刪除REMOVE級聯,您可以隨意刪除父母。

0

你可以設置你的瀑布下面一節通過編輯註釋如下不刪除

@OneToMany(cascade = {CascadeType.ALL}, mappedBy = "parent") 
private Set<Child> childs = new HashSet<Child>(); 

@OneToMany(cascade = {CascadeType.MERGE, CascadeType.PERSIST}, mappedBy = "parent") 

和任何其他CascadeType的選項,你需要(見CascadeType Enums)。這將使得當你刪除父母時,孩子也不會被刪除。