Hibernate / JPA双向级联saveOrUpdate

时间:2012-07-19 19:07:03

标签: java hibernate jpa hibernate-4.x

我试图为2个实体(新闻和标签)建立多对多的双向关系。

但是当我尝试saveOrUpdate新闻(已设置)时,不知怎的,它总是保存一组新的Tag甚至id已经填充在Tag中

我的注释有问题吗?

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存在,相关的Set将被忽略,如果Tag不存在则会插入新的,这可能吗?

请告知

1 个答案:

答案 0 :(得分:2)

问题是您的对象(标签)未连接&#34;。我的意思是,hibernate不知道你的对象,当你试图保存新闻时,hibernate会将你的标签视为新对象。尝试在保存或更新之前从db获取Tag对象并使用此对象。