2017-04-05 44 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}添加到您的標記實體,以防止刪除標記以刪除其關聯的文章。