因此,我有一个 JHipster
生成的应用程序,其中包含许多实体和集合,其中我有 Study 的主要实体,其中有许多集合。
其中之一是 StudySites,它是一个 ManyToMany
,所有者是 Study:
Study 中的关系和设置者:
@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;
}
StudySites 中的关系:
@ManyToMany(mappedBy = "studySites")
@JsonIgnore
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
private Set<Study> studys = new HashSet<>();
解释这些关系和我们处理这一切的方式可能非常复杂,这会导致一篇相当长的文章,所以我会尝试底线说我们将所有信息捆绑在一个 DTO
与 Angular 并将其发送到后端,在后端解压缩 Study 并将所有集合放入 StudyDTO 中,所有这些工作正常,我拥有所有字段中的所有数据,直到我们调用存储库中的 save 方法,它可以很好地保存除此特定实体的字段之外的所有其他集合。
如果我向研究中添加一个 StudySite,Hibernate
将为它分配一个 id,保存它,并将关系保存在连接表中,因此当我再次加载研究时,它将显示StudySite,但字段为空。
当我插入新的或尝试更新现有的时会发生这种情况
我还记录了 Hibernate 的变量绑定(bind),您可以在其中将所有值视为 null,但在保存到连接表中时,它已检索分配的 id 和 Study_id:
Hibernate: /* insert org.wwarn.nmfisurveyor.datamanagement.domain.StudySites */ insert into study_sites (country_id, dms_lat, dms_lon, google_lat, google_lon, province_name, site_name) values (?, ?, ?, ?, ?, ?, ?)
2017-02-14 17:12:50.972 TRACE 8859 --- [nio-8080-exec-9] o.h.type.descriptor.sql.BasicBinder : binding parameter [1] as [BIGINT] - [null]
2017-02-14 17:12:50.972 TRACE 8859 --- [nio-8080-exec-9] o.h.type.descriptor.sql.BasicBinder : binding parameter [2] as [VARCHAR] - [null]
2017-02-14 17:12:50.972 TRACE 8859 --- [nio-8080-exec-9] o.h.type.descriptor.sql.BasicBinder : binding parameter [3] as [VARCHAR] - [null]
2017-02-14 17:12:50.973 TRACE 8859 --- [nio-8080-exec-9] o.h.type.descriptor.sql.BasicBinder : binding parameter [4] as [DOUBLE] - [null]
2017-02-14 17:12:50.973 TRACE 8859 --- [nio-8080-exec-9] o.h.type.descriptor.sql.BasicBinder : binding parameter [5] as [DOUBLE] - [null]
2017-02-14 17:12:50.973 TRACE 8859 --- [nio-8080-exec-9] o.h.type.descriptor.sql.BasicBinder : binding parameter [6] as [VARCHAR] - [null]
2017-02-14 17:12:50.973 TRACE 8859 --- [nio-8080-exec-9] o.h.type.descriptor.sql.BasicBinder : binding parameter [7] as [VARCHAR] - [null]
Hibernate: /* insert collection row org.wwarn.nmfisurveyor.datamanagement.domain.Study.studySites */ insert into study_sites_study (studys_id, study_sitess_id) values (?, ?)
2017-02-14 17:12:50.980 TRACE 8859 --- [nio-8080-exec-9] o.h.type.descriptor.sql.BasicBinder : binding parameter [1] as [BIGINT] - [4089]
2017-02-14 17:12:50.980 TRACE 8859 --- [nio-8080-exec-9] o.h.type.descriptor.sql.BasicBinder : binding parameter [2] as [BIGINT] - [1629]
欢迎提出建议
PS:在我为追踪错误所做的各种事情中,我完全删除了该实体以及对其的所有引用(liquibase,所有内容)并使用不同的名称重新创建,没有任何改变。
最佳答案
不确定这是否是罪魁祸首,但我认为你的 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;
}
集合的遍历和研究实体的设置,我将留给一些存储库/服务方法来处理。
关于mysql - JPA集合保存id,但不保存其他字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42232719/