Quell'errore salta fuori quando si tenta di persistere un'entità child di una relazione, senza che sia stata resa persistente l'entità parent.
Non so con precisione come siano strutturate le tue entità, ma in ogni tuo esempio vedo una cosa del genere:
codice:
entityManager.persist(u);
entityManager.persist(paziente1);
paziente1.setUtente(u);
Ora, qualunque sia la logica che lega paziente ad utente (ancora non mi è chiara), quella cosa mi pare sbagliata. PRIMA si devono effettuare TUTTI i legami e solo DOPO si rendono persistenti le entità. Quindi, se c'è un legame di chiave tra utente e paziente, la riga
codice:
paziente1.setUtente( u );
va fatta prima di ogni altra azione di persistenza.
La regola aurea è: prima fai tutto ciò che è necessario affinchè la logica Java sia corretta e solo alla fine chiama in causa la persistenza.
Le operazioni di persistenza devono essere (quasi) sempre le ultime ad essere fatte.
In secondo luogo, quando crei dei legami (OneToMany, ecc) specifica sempre i vincoli di integrità referenziale (il CascadeType). Specificando, ad esempio, che il cascade sia PERSIST:
codice:
@OneToMany(cascade = CascadeType.PERSIST)
private Set<Paziente> pazienti;
A te basta rendere persistente l'entità padre e automaticamente verranno resi persistenti tutti i figli, senza che sia tu a dovertene preoccupare. Vedi qui.
Quindi:
codice:
Utente u = new Utente( ... );
Paziente p1 = new Paziente( ... );
Paziente p2 = new Paziente( ... );
...
Set<Paziente> mioSet = new HashSet<Paziente>();
mioSet.add( p1 );
mioSet.add( p2 );
...
u.setPazienti( mioSet );
...
// Automaticamente verranno resi persistenti tutti i pazienti
entityManager.persist( u );
Ciao.