1. 程式人生 > >Hibernate ManyToMany 刪除兩個實體的關聯

Hibernate ManyToMany 刪除兩個實體的關聯

在我的工程中,有這麼兩個實體: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