2013-04-16 6 views
2

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 
} 
+0

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

+0

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

+0

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

Répondre

0

Remplacez la ligne @OneToMany(cascade = REMOVE, mappedBy = "patient") avec

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

Merci d'avoir répondu. J'ai fait les changements suggérés mais toujours pas de chance? – Sam

0

Vérifiez lors de la création/mettre à jour vos objets que vous ajoutez des deux côtés de la relation .

+0

Le fournisseur appelle une opération d'ajout comme suit: – Sam

+0

Le service Fournisseur crée à la fois les instances Patient et Provider et appelle addTreatment sur les deux. Quand je fais plus tard un getTreatments sur les deux instances, je reçois seulement des traitements pour le fournisseur. C'est le problème étrange. Je vais poster le code quand je rentre à la maison ce soir. Merci, Sam – Sam

+0

Votre code ne jamais ajouter le traitement au patient ... – James

Questions connexes