2017-02-14 103 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