我在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这样的实体不应该影响另一个实体吗?
答案 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>