Hibernate - 自动@ManyToMany更新

时间:2015-06-28 16:33:15

标签: java hibernate orm many-to-many cascade

我有Article个实体,它有相关的Tag s:

@Entity
@Table(name = "articles")
public class Article implements Serializable{
   //other things

   @ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE})
   private List<Tag> tags;
}

Tag实体,其中包含Article s:

@Entity
@Table(name = "tags")
public class Tag implements Serializable{
    //other things

    @ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE})
    private List<Article> articles;
}

是否有机会配置Annotations,如果我使用指定的Article保存Tag

//simplified code
Tag tag = new Tag();
tags.add(tag)

article.setTags(tags);

articleService.save(article);
Article 相关的

Tag会自动更新,而不会使用axplicite调用add方法(tag.getArticles().add(article))?或者我必须手动完成?

这是单元测试的一部分,它显示了我试图实现的目标:

service.save(new TagDTO(null, tagValue, emptyArticles));
TagDTO tag = service.getAll().get(0);
List<TagDTO> tags = new ArrayList<>();
tags.add(tag);
articleService.save(new ArticleDTO(null, tags, articleContent));

List<ArticleDTO> articles = articleService.getAll();
assertEquals(1, articles.size());
final ArticleDTO articleWithTags = articles.get(0);
assertEquals(1, articleWithTags.getTags().size());
tags = service.getAll();
assertEquals(1, tags.size());
final TagDTO tagWithArticle = tags.get(0);
final List<ArticleDTO> articlesWithTag = tagWithArticle.getArticles();
assertEquals(1, articlesWithTag.size()); //it fails

现在哪个失败,因为Tag未使用相关的Article进行更新。

提前感谢您的回答!

1 个答案:

答案 0 :(得分:2)

您在多对多关系中缺少mappedBy属性。如果你不使用它,那么hibernate认为你有两种不同的单向关系。 我的意思是你的代码代表了这一点:

  • Article * ------------------[tags]-> * Tag
  • Tag * ------------------[articles]-> * Article

而不是:

  • Article * <-[articles]------[tags]-> * Tag

以下是在ArticleTag之间建立多对多双向关系的一种方法。请注意Tag-&gt;文章集合中的mappedBy属性。

@Entity
@Table(name = "articles")
public class Article implements Serializable{
   //other things

   @ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE})
   private List<Tag> tags;
}

@Entity
@Table(name = "tags")
public class Tag implements Serializable{
    //other things

    @ManyToMany(mappedBy="tags" ,cascade = {CascadeType.PERSIST, CascadeType.MERGE})
    private List<Article> articles;
}

编辑:看看这个Hibernate Documentation,了解如何编码不同的双向关联方案。