2017-04-05 59 views
3

删除连接表中的行我有以下模型:文章可以有一些标签,并且标签可以在一些文章上。 因此,它与3代表一个多一对多的关系:如何使用JPA

  • ARTICLE_TAG
  • TAG

当我删除一个标签,我想删除:

  • TAG中的标签
  • 标签和th之间的所有关系在ARTICLE_TAG标记的文章

但我不想删除ARTICLE当然的文章。

我该怎么做?

我尝试这一点,但它不工作:

Session session = HibernateUtil.getSessionFactory().getCurrentSession(); 
for (Article article : tagToDelete.getArticles()) { 
    article.getTags().remove(tagToDelete); 
} 
session.delete(tagToDelete); 

谢谢!

@Entity 
@Table(name="ARTICLE") 
public class Article extends AbstractAuditedEntity { 

    @Id 
    @Column(name="ID", nullable=false) 
    private Long id; 

    @ManyToMany 
    @JoinTable(name="ARTICLE_TAG", [email protected](name = "ARTICLE_ID"), [email protected](name = "TAG_ID")) 
    private Set<Tag> tags = new HashSet<>(); 

    public Article() {} 

    /** Getters & Setters */ 
} 

@Entity 
@Table(name="TAG") 
public class Tag { 

    @Id 
    @Column(name="ID", nullable=false) 
    private Long id;  

    @ManyToMany(mappedBy="tags") 
    private Set<Article> articles = new HashSet<>(); 

    public Tag() {} 

    /** Getters & Setters */   
} 
+0

你弄明白了吗? –

+0

你如何创建你的表?使用休眠2 ddl? –

回答

0

找到解决方案。在删除时,我们需要确保不要将删除级联到文章,反之亦然。

@ManyToMany(cascade={PERSIST, DETACH}) 
@JoinTable(name="ARTICLE_TAG", [email protected](name = "ARTICLE_ID"), [email protected](name = "TAG_ID")) 
private Set<Tag> tags = new HashSet<>(); 

我的问题是使用CascadeType.All,默认情况下包括CascadeType.REMOVE,这将级联的文章,它包含的标签的缺失。

您还可以将cascade={PERSIST, DETACH}添加到您的标记实体,以防止删除标记以删除其关联的文章。