如何使用与JPA的单向“ManyToOne”关系级联删除实体

时间:2013-10-28 02:57:24

标签: java hibernate jpa cascade openjpa

我有两个实体类'User'和'Department',具有单向'ManyToOne'关系,如下所示。

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的任何功能?

2 个答案:

答案 0 :(得分:5)

您可以使用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实现者确实提供了此功能的方法。

Hibernate使用@OnDelete注释提供此功能。

答案 1 :(得分:0)

您可以告诉hibernate删除'orphan'条目;

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