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

Blu*_*ice 3 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;
}
Run Code Online (Sandbox Code Playgroud)

如果我想删除一些用户并级联删除引用的部门,如果没有任何用户引用该部门,是否有使用JPA的任何功能?

cmd*_*cmd 5

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

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

请注意,某些JPA实现者确实提供了此功能的方法.

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