2012-07-19 142 views
1

我想爲2個實體(新聞和標籤)建立多對多的雙向關係。休眠/ JPA雙向級聯saveOrUpdate

但是,當我嘗試saveOrUpdate新聞(已設置),不知何故,總是將一組新的標籤ID,甚至在標籤

是不是有毛病我的註釋已填充?

News.java

@Id 
    @GeneratedValue(generator = "increment") 
    @GenericGenerator(name = "increment", strategy = "increment") 
    @Column(name = "NEWS_ID") 
    public Long getId() { 
     return id; 
    } 

    @ManyToMany(fetch = FetchType.LAZY, cascade = {CascadeType.PERSIST, CascadeType.MERGE}) 
    @Cascade(org.hibernate.annotations.CascadeType.SAVE_UPDATE) 
    @JoinTable(name = "NEWS_TAGS", joinColumns = @JoinColumn(name = "NEWS_ID"), inverseJoinColumns = @JoinColumn(name = "TAG_ID")) 
    public Set<Tag> getTags() { 
     return tags; 
    } 

Tag.java

@Id 
    @GeneratedValue(generator = "increment") 
    @GenericGenerator(name = "increment", strategy = "increment") 
    @Column(name = "TAG_ID") 
    public Long getId() { 
     return id; 
    } 

    private Collection<News> news; 

    @JsonIgnore 
    @ManyToMany(cascade = { CascadeType.PERSIST, CascadeType.MERGE }, mappedBy = "tags") 
    public Collection<News> getNews() { 
     return news; 
    } 

NewsDAO

public void save(News news){ 
     this.hibernateSessionFactory.getCurrentSession().saveOrUpdate(news); 
    } 

我想要做的是什麼的時候,我救 「新聞」,相關集將如果Tag存在,將被忽略,並且如果Tag不是,將會插入新的,這可能嗎?

請告知

+0

您的標記對象是否已連接(它們是否連接了休眠對象)? – 2012-07-19 19:13:57

+0

我只能從Web層獲取字符串,因此在對新聞執行saveOrUpdate之前,我必須重新創建集(從數據庫獲取標識並將其設置回標記)。有沒有辦法讓hibernate知道這些標籤。 – 2012-07-19 19:18:32

+1

嘗試從數據庫獲取對象(標記),而不僅僅是id。如果你使用已經連接的對象,它應該可以工作 – 2012-07-20 16:08:11

回答

2

問題是您的對象(標記)沒有「連接」。由此我的意思是hibernate不知道你的對象,當你試圖保存新聞時,hibernate會將你的標籤視爲新的對象。在保存或更新之前嘗試從數據庫獲取Tag對象並使用此對象。