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

标签 mysql angularjs hibernate jpa jhipster

因此,我有一个 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/

相关文章:

javascript - 无法在自定义指令中调用jquery datetimepicker函数

javascript - AngularJS Protractor 测试: function should return a promise

spring - 如何将外部文件中的属性包含到 hibernate.cfg.xml 中?

java - hibernate删除多对多关联

MySQL 帮助进行查询

javascript - 使用 AngularJS 将隐藏值传递给 JSON

php - 是否可以在一行中选择随机列?

spring - Hibernate @ManyToOne 与带有额外列的连接表似乎会生成无限循环

MySQL随机连接

mysql - 为每个不同的列值选择第一行