JPA单向级联操作

时间:2014-07-22 11:06:29

标签: java hibernate jpa jpa-2.0

我有以下JPA 2.0模型:

@Entity
public class Company {

  @OneToMany(mappedBy="company", targetEntity = Department.class, fetch=FetchType.LAZY, cascade=CascadeType.ALL)
    private List<Department> departments;

...
}

@Entity
public class Department {
    @ManyToOne
    @JoinColumn(name="company_id")
    private Company company;

...
}

当我尝试删除公司时,一切都很好 - 所有部门都被删除了。但是当我尝试删除Department时,会抛出以下异常: 引起:javax.persistence.EntityNotFoundException:传递给持久化的已删除实体:[my.model.Department#]

是否可以通过这种方式进行配置,当我删除部门时,公司没有任何事情发生?

@ManyToOne(cascade=CascadeType.REFRESH
部门模型上的

无法解决问题。

2 个答案:

答案 0 :(得分:3)

也许您没有从Department实例中的private List<Department> departments;删除引用的Company,因此仍然会引用已删除的实例。

从列表中删除已删除的部门也应该有效。

答案 1 :(得分:1)

如果您在Company中添加孤儿删除:

(JPA 2.0-way)

  @OneToMany(mappedBy="company", 
             targetEntity = Department.class,
             fetch=FetchType.LAZY, 
             cascade=CascadeType.ALL,
             orphanRemoval=true)
  private List<Department> departments;

(休眠路)

  @OneToMany(mappedBy="company", 
             targetEntity = Department.class,
             fetch=FetchType.LAZY, 
             cascade=CascadeType.ALL)
  @Cascade({ org.hibernate.annotations.CascadeType.ALL,
             org.hibernate.annotations.CascadeType.DELETE_ORPHAN })
  private List<Department> departments;

您可以执行以下操作删除部门:

company.getDepartments().remove(department);

然后存储Company(或在提交事务时)(假设Department可以由一个Company拥有。(无需告诉{{ 1}}删除EntityManager ..)