Hibernate ManyToMany 刪除兩個實體的關聯
阿新 • • 發佈:2019-01-04
在我的工程中,有這麼兩個實體:GrowthDiary.java(成長日記)和DiaryTag.java(日記標籤)。
大概就是和csdn發表文章給文章打標籤一個意思吧。
現在我想在後臺管理平臺刪除一個標籤,但是這個標籤已經有日記使用了,那麼我就需要先刪除標籤和日記的關聯。
原本我是這樣寫的:
@RequestMapping(value = "/delete", method = RequestMethod.POST) public @ResponseBody Message delete(Long[] ids) { for(Long id:ids){ DiaryTag diaryTag = diaryTagService.find(id); if(diaryTag!=null){ diaryTag.setGrowthDiaries(null); diaryTagService.update(diaryTag); diaryTagService.delete(diaryTag); } } return SUCCESS_MESSAGE; }
看方法體裡面就好,我想先將標籤裡面的日記置空,更新標籤,再刪除,然而這樣寫並沒有什麼卵用。
貌似我們一直沒有看看這兩個類,看看這兩個實體是怎麼關聯的:
GrowthDiary.java: /** 日誌標籤 */ private Set<DiaryTag> diaryTags = new HashSet<DiaryTag>(); /** * * @return * @see [類、類#方法、類#成員] */ @ManyToMany(fetch = FetchType.LAZY) @JoinTable(name = "t_pe_growth_diary_tag") @OrderBy("createDate asc") public Set<DiaryTag> getDiaryTags() { return diaryTags; } /** * @param 對diaryTags進行賦值 */ public void setDiaryTags(Set<DiaryTag> diaryTags) { this.diaryTags = diaryTags; }
DiaryTag.java /** 日誌標籤 */ private Set<GrowthDiary> growthDiaries = new HashSet<GrowthDiary>(); /** * @return 返回 growthDiaries */ @ManyToMany(mappedBy = "diaryTags", fetch = FetchType.LAZY) public Set<GrowthDiary> getGrowthDiaries() { return growthDiaries; } /** * @param 對growthDiaries進行賦值 */ public void setGrowthDiaries(Set<GrowthDiary> growthDiaries) { this.growthDiaries = growthDiaries; }
看到了吧,這兩張表的GrowthDiary.java裡面通過@JoinTable(name = "t_pe_growth_diary_tag") 關聯的。所有這個實體才是維護這兩個實體聯絡的主人。那麼我們就需要從GrowthDiary開始動手,下面就簡單了,我的程式碼:
@RequestMapping(value = "/delete", method = RequestMethod.POST)
public @ResponseBody
Message delete(Long[] ids)
{
for (Long id : ids)
{
DiaryTag diaryTag = diaryTagService.find(id);
if (diaryTag != null)
{
List<GrowthDiary> growthDiaries = growthDiaryService.findByDiaryTag(diaryTag);
if (growthDiaries != null && growthDiaries.size() > 0)
{
for (GrowthDiary growthDiary : growthDiaries)
{
growthDiary.getDiaryTags().remove(diaryTag);
growthDiaryService.update(growthDiary);
}
}
diaryTagService.delete(diaryTag);
}
}
return SUCCESS_MESSAGE;
}
參考文章:http://blog.csdn.net/remote_roamer/article/details/5690341