J'ai 3 classes d'entités mappées ci-dessous:relation JPA OneToMany
@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
}
Quand j'invoque getTreatments de chaque patient ou d'un fournisseur, je me attends JPA à remplir les traitements d'attributs. Cependant, cela ne fonctionne que pour le fournisseur. Peu importe ce que j'essaie, patient.getTreatments() retourne toujours vide.
Qu'est-ce qui me manque?
Voici le test de l'unité sur la fin du serveur:
@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
}
wow ... Comment vérifiez-vous que la liste est vide, débogueur? Voyez-vous la requête sql déclenchée par l'opération de chargement paresseux? Êtes-vous sûr d'avoir des données validées efficaces dans la base de données? – Gab
Yup. Je vois les entrées dans la base de données avec patient_fk et provider_fk pour l'enregistrement de traitement. Quand je reçois les traitements quand je fais provider.getTreatments mais pas pour le patient, peu importe ce que je fais. Pensait que j'ai manqué quelque chose de trivial ... – Sam
probablement ... mais je manque aussi;) Comme il est paresseux provider.getTreatments() restera vide jusqu'à ce que vous appelez une méthode sur la liste comme getSize() ou get (0) par exemple. – Gab