2016-01-10 254 views
1

剩餘關係的錯誤,我在JPA定義了兩個實體:員工技能JPA - @ManyToMany雙向關係,在反側去除實體,並與JoinTable

這個實體之間是定義關係@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<>(); 
} 

現在我有這樣的問題: 如果我使用實體管理器刪除技能實體。它刪除確定。但是在@JoinTable在數據庫employee_skill仍然與此刪除的實體(它的ID)的關聯。

我不想刪除員工當我刪除技能所以所有級聯刪除或orphanRemoval是沒有用在這裏。

我想爲什麼這種關係不會自動從數據庫中刪除。當這個關聯在連接表中仍然會給我javax.persistence.EntityNotFoundException:無法找到...

所以我可以在刪除Skill實體之前手動刪除此關聯。但是這是否是最佳做法?

刪除@ManyToMany雙向關係中實體的最佳做法是什麼?當移除像Employee或Skill這樣的實體不應該影響另一個實體嗎?

+0

設置關係的雙方是唯一真正的方法...既然你選擇了一個雙向關係 –

+0

你的意思是不確定? like for employee:skill.getEmployees(){employee.remove(skill); }確實從db –

+0

中刪除技能實體時。 「設置」意味着在傳遞到持久機制之前(即在刷新,提交之前)使兩個集合保持一致。你應該怎麼做所有的雙向關係 –

回答

0

由於Employee是關係擁有側(根據您的mappedBy值),其與Skill對象關係的任何更新將更新數據庫關聯。這是擁有方的責任,它會實現這一點。但其他方式不會發生。其中一個可能的解決方案是手動cascade規則定義數據庫,類似於在連接表如下:

FOREIGN KEY (skill_id) REFERENCES skills (id) 
    MATCH SIMPLE ON UPDATE CASCADE ON DELETE CASCADE 

這樣一來,任何更新Skill s就更新關聯數據庫。

的另一種方法是擁有方通過定義mappedByEmployee更改爲Skill,不覺得自然的基礎上Employee/Skill定型的關係。