@OneToMany双向关系返回null列表

时间:2018-09-14 08:14:11

标签: java spring jpa spring-data-jpa eclipselink

我有以下内容:

@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对象检索List,则列表为空。我猜这与可能冲突的两个关系有关吗?

结构的原因是,有时我们只知道患者的身份,因此我们可以从身份创建患者对象,但是稍后我们需要使用患者对象来检索患者的详细信息(包括身份) 。

在一个跨国公司内部,我正在创建“病理”,“患者”和“身份”对象,因为它们都是从一条消息中派生而来的。因此,患者可以具有许多身份和病状。然后,我需要通过包括身份在内的AMQP将病理形式转发为JSON。这是失败的地方: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 :(得分:1)

您需要在两端维护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);