【问题标题】:Hibernate/JPA Bidirectional cascade saveOrUpdateHibernate/JPA 双向级联 saveOrUpdate
【发布时间】:2025-12-06 18:05:02
【问题描述】:

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

但是当我尝试保存或更新新闻(已设置)时,它总是以某种方式保存一组新的标签,即使标签中已经填充了 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;
    }

标签.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;
    }

新闻DAO

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

我想做的是,当我保存“新闻”时,如果标签存在,相关的Set将被忽略,如果标签不存在,则插入新的,这可能吗?

请指教

【问题讨论】:

  • 你的标签对象是否已经连接(它们是休眠连接的对象)?
  • 我只能从 web 层获取字符串,所以我必须在对新闻执行 saveOrUpdate 之前重新创建集合(从 db 获取 id 并将其设置回 Tag)。有没有办法让休眠知道这些标签。
  • 尝试从数据库中获取对象(标签),而不仅仅是 id。如果你使用已经连接的对象,它应该可以工作
  • 成功了。谢谢。我在新闻对象中设置了 set ,当我保存或更新新闻时它起作用了。请添加一个答案,这样我就可以结束这个问题,你得到积分;)

标签: java hibernate jpa hibernate-4.x


【解决方案1】:

问题是您的对象(标签)没有“连接”。我的意思是休眠不知道您的对象,当您尝试保存新闻时,休眠将始终将您的标签视为新对象。尝试在保存或更新之前从 db 获取 Tag 对象并使用该对象。

【讨论】: