我有两个实体类'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的任何功能?
答案 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 TABLE
或ALTER 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 })