2013-10-28 77 views
3

我有兩個具有單向'ManyToOne'關係的實體類'User'和'Department',如下所示。如何級聯具有單向'ManyToOne'關係的刪除實體與JPA

public class User{ 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long id; 

    @ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY) 
    @JoinColumn(name = "DEPARTMENT_ID", nullable = true) 
    private Department department; 
} 

public class Department{ 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long id; 
} 

如果我想刪除一些用戶和級聯刪除引用部門如果沒有任何用戶參考系,有JPA的任何功能使用嗎?

+0

您是否解決了您的問題? –

回答

4

您可以使用CascadeType.DELETE,但此註釋僅適用於EntityManager中的對象,而不適用於數據庫。你想確保ON DELETE CASCADE被添加到數據庫約束。要驗證,您可以配置JPA生成一個ddl文件。看看ddl文件,您會注意到ON DELETE CASCADE不是約束的一部分。將ON DELETE CASCADE添加到ddl文件中的實際SQL中,然後從ddl更新數據庫架構。這將解決您的問題。

link顯示瞭如何在MySQL中使用ON DELETE CASCADE作爲CONSTRAINT。你在約束上做到這一點。您也可以在CREATE TABLEALTER TABLE聲明中執行此操作。 JPA很可能在ALTER TABLE聲明中創建約束。只需在該語句中添加ON DELETE CASCADE即可。

請注意,某些JPA實現者提供了此功能的一種手段。

休眠確實使用@OnDelete註釋提供此功能。

+0

非常感謝您的回覆。但是我很抱歉,我們不允許在數據庫層實現這個功能,只有標準的JPA可以用來解決這個問題。 – BlueMice

0

你可以讓hibernate刪除'孤立'條目;

@Cascade({ org.hibernate.annotations.CascadeType.ALL, org.hibernate.annotations.CascadeType.DELETE_ORPHAN })