JPA CascadeType.REMOVE 不工作
JPA CascadeType.REMOVE not working
我有两个实体 Business,它们由 Departments
的列表组成
@Entity
@Table(name = "Business")
public class Business implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "Id")
private Long id;
@OneToMany(mappedBy = "business",
cascade = {CascadeType.PERSIST, CascadeType.REMOVE})
private List<Department> departments;
@OneToMany(mappedBy = "business", orphanRemoval = true,
cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REMOVE})
private List<Process> processs;
@ManyToMany
private List<Competence> competences;
}
@Entity
@Table(name = "Department")
public class Department implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@OneToMany(mappedBy = "father",
cascade = {CascadeType.PERSIST, CascadeType.REMOVE})
private List<Department> departments;
}
当我尝试删除业务实例时,我得到一个 Mysql 异常
无法删除或更新父行:外键约束失败 (evac_java
.Department
, CONSTRAINT FK_Department_Business
FOREIGN KEY (Business
) 参考资料 Business
(Id
)):HY000 - null
这意味着我无法删除业务实例,因为它有与其关联的部门,但部门不能单独存在,所以我想在删除时删除所有业务部门。我以为我可以通过将 cascade = CascadeType.REMOVE 添加到业务实体中的 @OneToMany 注释来实现这一点,但它不起作用。
我在网上搜索了一下,在 Whosebug 上发现了很多与这个问题类似的问题,但他们的建议都是一样的:add cascade = CascadeType.REMOVE or CascadeType.ALL
所以我想知道我是否遗漏了什么。
我正在使用 Glassfish 4.1 和 EclipseLink
我试过
@OneToMany(mappedBy = "business", orphanRemoval = true)
private List<Department> departments;
在业务实体上,但它也不起作用
这是我用来删除在抽象中声明的实体的方法 class
public void remove(T entity) {
getEntityManager().remove(getEntityManager().merge(entity));
}
JPA 只能删除并级联删除它知道的实体,如果您没有维护这种双向关系的双方,就会出现这样的问题。如果部门集合为空,请在删除之前尝试 em.refresh(),强制 JPA 填充所有关系,以便可以正确删除它们,但最好在进行更改时维护关系的双方避免数据库命中。
我有两个实体 Business,它们由 Departments
的列表组成@Entity
@Table(name = "Business")
public class Business implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "Id")
private Long id;
@OneToMany(mappedBy = "business",
cascade = {CascadeType.PERSIST, CascadeType.REMOVE})
private List<Department> departments;
@OneToMany(mappedBy = "business", orphanRemoval = true,
cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REMOVE})
private List<Process> processs;
@ManyToMany
private List<Competence> competences;
}
@Entity
@Table(name = "Department")
public class Department implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@OneToMany(mappedBy = "father",
cascade = {CascadeType.PERSIST, CascadeType.REMOVE})
private List<Department> departments;
}
当我尝试删除业务实例时,我得到一个 Mysql 异常
无法删除或更新父行:外键约束失败 (evac_java
.Department
, CONSTRAINT FK_Department_Business
FOREIGN KEY (Business
) 参考资料 Business
(Id
)):HY000 - null
这意味着我无法删除业务实例,因为它有与其关联的部门,但部门不能单独存在,所以我想在删除时删除所有业务部门。我以为我可以通过将 cascade = CascadeType.REMOVE 添加到业务实体中的 @OneToMany 注释来实现这一点,但它不起作用。
我在网上搜索了一下,在 Whosebug 上发现了很多与这个问题类似的问题,但他们的建议都是一样的:add cascade = CascadeType.REMOVE or CascadeType.ALL
所以我想知道我是否遗漏了什么。
我正在使用 Glassfish 4.1 和 EclipseLink
我试过
@OneToMany(mappedBy = "business", orphanRemoval = true)
private List<Department> departments;
在业务实体上,但它也不起作用
这是我用来删除在抽象中声明的实体的方法 class
public void remove(T entity) {
getEntityManager().remove(getEntityManager().merge(entity));
}
JPA 只能删除并级联删除它知道的实体,如果您没有维护这种双向关系的双方,就会出现这样的问题。如果部门集合为空,请在删除之前尝试 em.refresh(),强制 JPA 填充所有关系,以便可以正确删除它们,但最好在进行更改时维护关系的双方避免数据库命中。