2017-02-14 4 views
0

Итак, у меня есть созданное приложение JHipster с несколькими сущностями и коллекциями, среди основных объектов, в которых у меня есть Study, у которого есть несколько коллекций.JPA коллекция с сохранением id, но не с другими полями

Одним из них является StudySites, это ManyToMany где владелец Исследование:

Соотношение и сеттер в исследовании:

@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 информацию в DTO с Angular и отправить ее на бэкэнд, где он распаковывает Studys и помещает все коллекции в StudyDTO, все это работает отлично, у меня есть все данные во всех полях вплоть до вызова метода сохранения из репозитория, где он сохраняет все остальные коллекции только штрафом, за исключением полей этого конкретного объекта.

Если я добавлю StudySite к исследованию, Hibernate присвоит ему идентификатор, сохранит его, а также сохранит отношение в таблице соединений, поэтому, когда я снова загружу исследование, он покажет StudySite, но с пустыми полями.

Это происходит, когда я вставить новую или если я пытаюсь обновить существующий

Я также вошел переменное связывание с Hibernate, где вы можете оценить все значения происходят как нуль, но при сохранении в присоединиться к таблице он извлечет назначенный идентификатор и 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: Среди различных вещей, которые я сделал, чтобы отследить ошибку, я полностью стерта сущность и все ссылки к нему (li quibase, все) И воссозданный с другим именем, ничего не изменилось.

ответ

0

я наконец-то удалось решить эту проблему, сначала я просто изменил cascadeType к ALL вместо PERSIST, он работал нормально все время это не нужно объединить тот же экземпляр StudySite для различных исследований в той же форме , Поэтому после некоторого размышления я понял, что основной проблемой было то, что в отношении Many to Many вы не можете ожидать Hibernate, чтобы сохранить вновь созданный объект, а также сохранить отношение в таблице соединений, по крайней мере, не так, как мы это делали.

Так что я просто подправил дизайн, открывая модальность, когда пользователю необходимо создать новый объект, сохранив его первым, а затем сохранить его в соединительной таблице, когда пользователь нажимает сохранить для всей формы

Что было что Hibernate не удалось сохранить новые поля, но сохранил отношение в таблице соединений, поэтому сгенерированный идентификатор с пустыми полями

0

Не уверен, если это преступник, но по-моему, ваш метод сеттера:

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 имеют одинаковый набор. – Steven

Смежные вопросы