JPA单向级联操作



我有以下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;
...
}

当我试图删除Company时,一切都很好-所有部门都被删除了。但是当我试图删除Department时,它抛出了以下异常:由于:javax.persistence.EntityNotFoundException:删除实体传递给持久化:[my.model.Department#]

是否可以这样配置,当我删除Department时,Company不会发生任何变化?

@ManyToOne(cascade=CascadeType.REFRESH

on Department model并不能解决问题

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

将已删除的部门也从列表中删除,它应该可以工作。

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

(JPA 2.0方法)

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

(Hibernate-way)
  @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拥有)。(不需要告诉EntityManager删除Department ..)

最新更新