Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.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
Mysql JPA集合保存id,但不保存其他字段_Mysql_Angularjs_Hibernate_Jpa_Jhipster - Fatal编程技术网

Mysql JPA集合保存id,但不保存其他字段

Mysql JPA集合保存id,但不保存其他字段,mysql,angularjs,hibernate,jpa,jhipster,Mysql,Angularjs,Hibernate,Jpa,Jhipster,因此,我有一个JHipster生成的应用程序,其中包含许多实体和集合,在我研究的主要实体中,有许多集合 其中一个是StudySites,这是一个manytomy,其中所有者是StudySites: 学习中的关系和设定者: @ManyToMany(cascade = CascadeType.PERSIST, fetch = FetchType.EAGER) @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) @

因此,我有一个
JHipster
生成的应用程序,其中包含许多实体和集合,在我研究的主要实体中,有许多集合

其中一个是StudySites,这是一个
manytomy
,其中所有者是StudySites:

学习中的关系和设定者:

@ManyToMany(cascade = CascadeType.PERSIST, fetch = FetchType.EAGER)
    @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
    @JoinTable(name = "study_sites_study",
        joinColumns = @JoinColumn(name="studys_id", referencedColumnName="ID"),
        inverseJoinColumns = @JoinColumn(name="study_sitess_id", referencedColumnName="ID"))
    private Set<StudySites> studySites = new HashSet<>();

public void setStudySites(Set<StudySites> studySites) {
        studySites.stream().forEach(ss-> {
            Set<Study> setStudys=ss.getStudys();
            setStudys.add(this);
            ss.setStudys(setStudys);
        });
        this.studySites = studySites;
    }
欢迎提出任何建议


PS:在我为追踪错误所做的各种工作中,我完全删除了实体及其所有引用(liquibase,everything),并使用不同的名称重新创建,没有任何更改。

不确定这是否是罪魁祸首,但我认为您的setter方法:

public void setStudySites(Set<StudySites> studySites) {
        studySites.stream().forEach(ss-> {
            Set<Study> setStudys=ss.getStudys();
            setStudys.add(this);
            ss.setStudys(setStudys);
        });
        this.studySites = studySites;
    }
public void setStudySites(Set studySites){
studySites.stream().forEach(ss->{
设置setStudys=ss.getStudys();
setStudys.add(这个);
ss.setStudys(setStudys);
});
this.studySites=studySites;
}
应减至:

public void setStudySites(Set<StudySites> studySites) {
        this.studySites = studySites;
    }
public void setStudySites(Set studySites){
this.studySites=studySites;
}

遍历集合并设置Studys实体,我将留给一些存储库/服务方法来处理。

我最终设法解决了这个问题,起初我只是将
级联类型更改为
所有
,而不是
持久化
,它一直工作正常,不需要将同一个
StudySite
实例以相同的形式合并到不同的研究中。因此,经过一番思考后,我意识到潜在的问题是,在一个
多对多
关系中,您不能期望
Hibernate
保存一个新创建的实体,并将该关系保存在联接表中,至少不能像我们这样做

所以我只是调整了设计,当用户需要创建一个新实体时打开一个模式,首先保存它,然后在用户点击整个表单的save时将它保存在连接表中


之前发生的事情是,
Hibernate
无法持久化新字段,但正在将关系保存在联接表中,因此生成的带有空字段的id

尝试了这一点,以防万一,但这会在保存时产生错误,因为在StudyTo中设置研究时未将研究添加到研究集合。但是,所有其他许多集合都具有相同的setter。
public void setStudySites(Set<StudySites> studySites) {
        studySites.stream().forEach(ss-> {
            Set<Study> setStudys=ss.getStudys();
            setStudys.add(this);
            ss.setStudys(setStudys);
        });
        this.studySites = studySites;
    }
public void setStudySites(Set<StudySites> studySites) {
        this.studySites = studySites;
    }