JPA - @ManyToMany双向关系,删除反面的实体和JoinTable中剩余关系的错误

时间:2016-01-10 16:32:21

标签: java hibernate jpa

我在JPA中定义了两个实体:员工技能

在这些实体之间定义了关系 @ManyToMany

public class Employee { 

     @ManyToMany(fetch = FetchType.LAZY)
     @JoinTable(name = "employee_skill",
        joinColumns = @JoinColumn(name = "employee_id"),
        inverseJoinColumns = @JoinColumn(name = "skill_id")
     )
     private Set<Skill> skills = new HashSet<>();
}

public class Skill { 

     @ManyToMany(mappedBy = "skills", fetch = FetchType.LAZY)
     private Set<Employee> skilledEmployees = new HashSet<>(); 
}

现在我有这样的问题: 如果我使用实体管理器删除技能实体。它删除了确定。但是在数据库 employee_skill 中的 @JoinTable 中,仍然存在与此已删除实体(其ID)的关联。

我在删除技能时不想删除员工,因此所有CASCADE REMOVING或orphanRemoval在这里都没用。

我认为为什么这种关系不会自动从数据库中删除。当连接表中的这种关联仍然存在时,它会给我 javax.persistence.EntityNotFoundException:无法找到...

因此,在删除Skill实体之前,我可以手动删除此关联。但它真的是最好的做法吗?

在@ManyToMany双向关系中删除实体的最佳做法是什么?删除像Employee或Skill这样的实体不应该影响另一个实体吗?

1 个答案:

答案 0 :(得分:0)

由于Ans=solve(dT==((-gra-H_vap*m_lg+grb*./ro_cp),dT); 是关系的拥有方(基于您的Employee值),因此与mappedBy个对象的关系的任何更新都会更新数据库关联。这是拥有方的责任,它将实现这一目标。但另一种方式不会发生。您可能的解决方案之一是手动定义数据库Skill规则,如连接表中的后续内容:

cascade

这样,对FOREIGN KEY (skill_id) REFERENCES skills (id) MATCH SIMPLE ON UPDATE CASCADE ON DELETE CASCADE 的任何更新都会更新数据库中的关联。

另一种方法是通过在Skill中定义Skill来将拥有方更改为mappedBy,而Employee根据Employee/Skill陈规定型关系感觉不自然。< / p>