JPA OnetoMany关系

时间:2013-04-16 05:19:47

标签: jpa one-to-many

我有3个实体类映射如下:

@Table(name = "PROVIDER")
public class Provider implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue
    private long id;
    private long npi;
    private String name;
    private String specialization;
    @OneToMany(mappedBy = "provider", cascade = REMOVE)
    @OrderBy
    private List<Treatment> treatments;
    @Transient
    private ITreatmentDAO treatmentDAO;
    // and so forth
}

@Table(name = "PATIENT")
public class Patient implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue
    private long id;
    private long patientid;
    private String name;
    @Temporal(TemporalType.DATE)
    private Date birthDate;
    @OneToMany(cascade = REMOVE, mappedBy = "patient")
    @OrderBy
    private List<Treatment> treatments;
    // and so forth
}

@Table(name = "TREATMENT")
public abstract class Treatment implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue
    private long id;
    private String diagnosis;
    @ManyToOne
    @JoinColumn(name = "patient_fk", referencedColumnName = "id")
    private Patient patient;
    @ManyToOne
    @JoinColumn(name = "provider_fk", referencedColumnName = "id")
    private Provider provider;
    // and so forth
}

当我在Patient或Provider上调用getTreatments时,我希望JPA填写治疗属性。但是这仅适用于Provider。无论我尝试什么,patient.getTreatments()总是返回空白。

我错过了什么?

这是服务器端的单元测试:

@Test
public void TestAddTreatment() throws PatientExn, ProviderExn {
        GregorianCalendar bd = new GregorianCalendar();
        bd.set(1977, 03, 13);
    Patient patient = this.pf.createPatient(900L, "Orezi.Dauda", bd.getTime());
    Provider provider = this.prf.createProvider(6777L, "Sam.OKafor");
    this.pdao.getEntityManager().getTransaction().begin();
    this.pdao.addPatient(patient);
    this.pdao.getEntityManager().getTransaction().commit();
    this.prdao.getEntityManager().getTransaction().begin();
    this.prdao.addProvider(provider);
    provider.addDrugTreatment(900L, "Malaria", "Chloroquine", (float)5.0);
    this.prdao.getEntityManager().getTransaction().commit();
    List<Long> providerTids = this.prdao.getProviderByNpi(6777L).getTreatmentIds();
    List<Long>patientTids = this.pdao.getPatientByPatientId(900L).getTreatmentIds();
    assert(providerTids.size() == 1); //Passes
    assert(patientTids.size() == 1);// Fails
}

2 个答案:

答案 0 :(得分:0)

将行@OneToMany(cascade = REMOVE, mappedBy = "patient")替换为

@OneToMany(cascade = CascadeType.ALL, mappedBy = "patient", orphanRemoval = true) and try it should work

答案 1 :(得分:0)

确保在创建/更新对象时添加到关系的两侧。