在我的工程中,有这么两个实体: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