3

我有两个具有单向“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 的任何功能可以使用吗?

4

2 回答 2

5

您可以使用CascadeType.DELETE,但是此注释仅适用于 中的对象EntityManager,而不适用于数据库。您要确保将ON DELETE CASCADE其添加到数据库约束中。要进行验证,您可以配置 JPA 以生成 ddl 文件。查看ddl文件,您会注意到它ON DELETE CASCADE不是约束的一部分。添加ON DELETE CASCADEddl文件中的实际 SQL,然后从 ddl 更新您的数据库架构。这将解决您的问题。

链接显示如何在 MySQL中使用ON DELETE CASCADEon 。CONSTRAINT您在约束上执行此操作。您也可以在CREATE TABLEorALTER TABLE语句中执行此操作。JPA 很可能在ALTER TABLE语句中创建了约束。只需添加ON DELETE CASCADE到该声明。

请注意,一些 JPA 实现者确实为此功能提供了一种方法。

Hibernate 确实使用@OnDelete注解提供了这个功能。

于 2013-10-28T03:29:04.453 回答
0

您可以告诉休眠删除“孤儿”条目;

@Cascade({ org.hibernate.annotations.CascadeType.ALL, org.hibernate.annotations.CascadeType.DELETE_ORPHAN })
于 2013-10-30T20:24:03.687 回答