2011-02-10 232 views
2

我使用JPA中的以下內容:刪除相關@OneToOne自動JPA

@Entity 
class ParentClass { 
    @Id 
    @GeneratedValue 
    private long id; 
    ... 
    @OneToOne(cascade = { cascade = { CascadeType.ALL }, 
         mappedBy = "parentClass") 
    ChildClass child; 
    .. 
} 

@Entity 
class ChildClass { 

    @OneToOne 
    ParentClass parentClass; 

} 

如果我做一個查詢類似的createQuery(「DELETE FROM父類PC」),我的子類不會自動刪除。

這可以用JPA-2.0來完成嗎? (我的工作與@OneToMany關係)。

回答

4

批量DML查詢(如DELETE FROM ParentClass pc忽略級聯選項和orphanRemoval),因此如果實際需要在批量查詢中執行此操作,則無法將JPA配置爲自動刪除ChildClass es。

但是,您可以通過在數據庫模式中將REFERENCES ... ON DELETE CASCADE約束添加到ChildClass的前導密鑰來配置數據庫。

+1

+1我相信這是正確的答案。我認爲,ON DELETE CASCADE可能會導致一些小問題,因爲JPA提供商不會選擇它。因此,如果您以後決定再次調用類似em.persist(child)的東西,JPA會認爲它已經存在等等。另外,孩子不會從緩存中清除等。 – 2011-02-10 15:09:11

3

在JPA2中,您可以在@OneToOne註釋上設置orphanRemoval = true。不過,我會說CascadeType.ALL應該處理該問題。如果您調用em.remove(parentClass)而不是調用查詢,會怎樣?