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;
}