我有以下内容:
@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
答案 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);