Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hibernate/JPA双向级联存储更新_Java_Hibernate_Jpa_Hibernate 4.x - Fatal编程技术网

Java Hibernate/JPA双向级联存储更新

Java Hibernate/JPA双向级联存储更新,java,hibernate,jpa,hibernate-4.x,Java,Hibernate,Jpa,Hibernate 4.x,我试图为2个实体(新闻和标签)建立多对多的双向关系 但当我试图保存或更新新闻(已设置)时,它总是以某种方式保存一组新的标记,即使标记中已经填充了id 我的注解有问题吗 java @Id @GeneratedValue(generator = "increment") @GenericGenerator(name = "increment", strategy = "increment") @Column(name = "NEWS_ID") public L

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

但当我试图保存或更新新闻(已设置)时,它总是以某种方式保存一组新的标记,即使标记中已经填充了id

我的注解有问题吗

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;
    }
我想做的是,当我保存“News”时,如果标签存在,相关的集合将被忽略,如果标签不存在,将插入新的集合,这可能吗


请告知

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

您的标记对象是否已连接(它们是否休眠连接的对象)?我只能从web层获取字符串,因此在对新闻进行saveOrUpdate之前,我必须重新创建该集(从db获取id并将其设置回标记)。有没有办法让hibernate知道这些标记。请尝试从数据库中获取对象(标记),而不仅仅是id。如果使用已连接的对象,它应该可以工作。谢谢我在news对象中设置了集合,当我保存或更新新闻时,它就起作用了。请添加一个答案,这样我可以结束问题,您就可以得到分数;)
    @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;
    }
public void save(News news){
         this.hibernateSessionFactory.getCurrentSession().saveOrUpdate(news);
    }