JPA CascadeType.REMOVE无效

时间:2015-04-19 18:16:59

标签: java jpa eclipselink java-ee-7

我有两个实体 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_javaDepartment,CONSTRAINT FK_Department_Business FOREIGN KEY(Business)REFERENCES {{ 1}}(Business)):HY000 - null

这意味着我无法删除业务实例,因为它有与之关联的部门,但部门本身不存在,所以我想删除所有业务部门。我想我会通过将cascade = CascadeType.REMOVE添加到业务实体中的@OneToMany注释来实现这一点,但它不起作用。

我在网上搜索了一下,我在stackoverflow上发现了很多与此类似的问题,但它们都提出了相同的建议: add cascade = CascadeType.REMOVE或CascadeType.ALL

所以我想知道我是否错过了一些事情。

我正在使用Glassfish 4.1和EclipseLink

我试过

Id

在业务实体上,但它不起作用

这是我用来删除在抽象类中声明的实体的方法

@OneToMany(mappedBy = "business", orphanRemoval = true)
private List<Department> departments;

1 个答案:

答案 0 :(得分:2)

JPA只能删除并级联它所知道的删除实体,如果你没有维护这种双向关系的双方,那么就会出现这样的问题。如果部门集合为空,请在删除之前尝试使用em.refresh(),强制JPA填充所有关系,以便可以正确删除它们,但最好保持关系的两面,以避免更改数据库命中了。