2017-02-14 60 views
0

所以,我有一些实体和集合的JHipster生成的应用程序,其中包括主要的实体我有研究,有许多藏品。JPA收集保存的ID,而不是其他领域

其中之一是StudySites,它是一个ManyToMany这里的主人是研究:

在研究的关系和setter:

@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<>(); 

关系和我们处理这一切的方式都可能相当复杂地解释,并且会导致一个相当大的帖子,所以我会尝试将其底线说出来, LL与Angular并将其发送到后端,它解压缩Studys并把所有集合在StudyDTO在DTO的信息,所有这一切工作得很好,我在所有领域的所有数据的权利,直到我们调用保存方法从存储库中,除了这个特定实体的字段外,它保存了其他每个集合都很好。

如果我将StudySite添加到Study中,Hibernate将为其分配一个id,保存它并将关系保存到连接表中,因此当我再次加载Study时,它将显示StudySite,但显示空字段。

发生这种情况时,我插入一个新的,或者如果我尝试更新现有

我也记录了可变从休眠结合在这里你可以欣赏所有的值要在为空,但在保存时连接表已检索到所分配的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:在各类事情我已经做了跟踪误差,我完全抹掉实体和所有的参照它(李quibase,一切)并用不同的名称重新创建,没有任何改变。

回答

0

我终于设法解决这个问题,起初我只是改变了cascadeTypeALL而不是PERSIST,它的工作好一切的时候它没有需要合并一个StudySite到不同的研究相同的实例在同一形式。所以经过一番思考,我意识到潜在的问题是,在一个Many to Many关系,你不能指望Hibernate保存新创建的实体,并保存在连接表的关系,至少不是我们做的方式。

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

是什么将其保存在连接表发生之前是Hibernate不能坚持新的领域,但保存在关系表中的关系,因此生成的ID与空字段

0

不知道这是否是罪魁祸首,但在我看来,你的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; 
    } 

收集的穿越和设置Studys实体,我会留下一些存储库/服务方法来处理。

+0

试过,以防万一早些时候,但保存为在StudyDTO中设置它们时,您并未将研究添加到研究集合中。但是,所有其他ManyToMany集合都具有相同的setter。 – Steven