Двунаправленное отношение @OneToMany возвращает нулевой список - PullRequest
0 голосов
/ 14 сентября 2018

У меня есть следующее:

@Entity
@Table(name = "patient_identifiers")
public class PatientIdentity extends AbstractEntity {
    @ManyToOne
    @JoinColumn(name = "patient_id")
    private Patient patient;

и

@Entity
@Table(name = "patients")
public class Patient extends AbstractEntity {
    @OneToMany(mappedBy = "patient", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    private List<PatientIdentity> urs;

Объекты сохраняются правильно, однако, если я использую объект Patient для получения списка, список будет нулевым. Я предполагаю, что это как-то связано с конфликтом двух отношений?

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

В транснациональном сообществе я создаю объекты «Патология», «Пациент» и «Идентичность», поскольку все они получены из одного сообщения. Таким образом, пациент может иметь много идентичностей и патологий. Затем мне нужно переслать патологию в виде JSON поверх AMQP, включая идентификатор. Вот где это терпит неудачу: Pathology.getPatient.getPrimaryIdentity PrimaryIdentity является производным от Списка идентификаторов.

myIdentity = new PatientIdentity();
myIdentity.setUr(ur);
myIdentity.setCreated(new Date());
myIdentity.setPrimary(true);
patientIdentityService.create(myIdentity);

Patient myPatient = new Patient();
myPatient.setDateOfBirth(dateOfBirth);
myPatient.setDateOfDeath(dateOfDeath);
myPatient.setLastUpdated(new Date());
repo.saveAndFlush(myPatient);

myIdentity.setPatient(myPatient);

Я попробовал следующее, но только что закончил цикл исключений

myPatient.getUrs().add(myIdentity);

Я использую EclipseLink / Spring Data

1 Ответ

0 голосов
/ 14 сентября 2018

Вам необходимо поддерживать отношения между PatientIdentity и Patient на обоих концах.Лучше всего было бы добавить метод в Patient addIdentity (PatientIdentity PatientIdentity);

public void addIdentity(PatientIdentity patientIdentity) {
   if (urs=null) {
      urs = new ArrayList<PatientIdentity>();
   }
   urs.add(patientIdentity);
   patientIdentity.setPatient(this);
}

    myIdentity = new PatientIdentity();
    myIdentity.setUr(ur);
    myIdentity.setCreated(new Date());
    myIdentity.setPrimary(true);
   // you don't need this code any longer since you are cascading your persist. 
   //patientIdentityService.create(myIdentity);

    Patient myPatient = new Patient();
    myPatient.setDateOfBirth(dateOfBirth);
    myPatient.setDateOfDeath(dateOfDeath);
    myPatient.setLastUpdated(new Date());

    myPatient.addIdentity(myIdentity);

    // this will cascade the persist
    repo.saveAndFlush(myPatient);
...