Newsgroup: it.comp.java
Titolo: jpa aiutatemi per update di tre entita .

Ciao a tutti . Vi sarei molto grato se riusciste a aiutarmi.
Sto studiando jpa , ma non riesco a capire come si fa l'update  di 2
entita collegate con una relazione @OneTOMany e @ManyToOne.
per esempio in un Db ho 2 entita;
entita :Dormitorio
entita : Studente
--------------------------------------------
Nell'entita Dormitorio avrò una proprietà:
@OneTOMany(mappedBy="dormitorio")
 List<Studente> listastudenti
........................................................
nell'entita Studente
@ManyToOne
Dormitorio dormitorio
--------------------------------------
la mia domanda è:
dopo aver inserito una serie di dormitori e alcuni studenti,
nell'ipotesi che uno studente cambi dormitorio ,come faccio 'update?
NEl Ejb Session ho scritto un metodo :
public void aggiornaStudente(Integer idStudente, Integer
idNuovoDormitorio){
Studente stdaaggionare=
entitiymanager.find(Studente.class,idStudente);
Dormitorio vecchiodormitorio = stdaaggionare.getDormitorio();// qui
vecchiodormitorio è managed o detached inquanto      //presa con il
get ??
DOrmitorio nuovodormitorio =
entitymanager.find(DOrmitorio.class.idNnuovoDormitorio);
// come continuo??????????
}
// qui ho l'entita studentedaaggionare e nuovodormitorio nel contesto
di persistenza dentro la transazione .
// ma vecchiodormitorio che ho ottenuto da studente con il get è
anch'essa managed o detached??????oppure lo devo
               rendere attached con un em.refresh
(vecchioDormitorio )??
// ora come faccio ad aggionare lo studente e i 2 dormitori?? si deve
sempre utilizzare il metodo em.merge(entita) dopo che ho settato
qulacosa all'interno della transazione o non è necessario ?
// non ho inserito alcuna cascadeType.
// mi potreste per cortesia spiegare come completare il metodo sia nel
caso che non inserisco alcun attributo per la casacadetype che nel
caso invece in cui  inserisco un cascadetype.ALL ??
...........................................................
so che se setto l'attributo cascade allora nel corso della transazione
vengono aggionate tutte le entita correlate dal verso principale .
Ossia se cambio qualcosa in Studente ,
MA non capisco nel lato inverso della relazione.
Ma quindi se setto un altro dormitorio per studente , avendo
cascade=all la variazione avvienne anche nell'oggetto dormitio vecchio
e dormitorio nuovo??'?
Grazie infinite per l'attenzione .
MAuro
nb:ho gia provato da solo ma non risolvo.

 ........................................................
ma ti serve la bidirezionalita'?
di solito complica le cose inutilmente.
ad esempio la lista di studenti per dormitorio la trovi facilmente con
una query su studenti.
quindi togliendo il onetomany da dormitorio sarebbe
s = find(idStudente)
d = find(idNuovoDormitorio)
s.setDormitorio(d);
merge(s);
per avere la lista studenti per dormitorio
from Studenti where 
dormitorio.id
=:idDormitorio

MA  in un tutorial ho visto che impostavano la bidirezionalità .
Se lascio tale bidirezionalità come mi comporto?

 Se lascio tale bidirezionalità come mi comporto?
Devi impostare il cascadeType.
Qualcosa del tipo:
@OneToMany (cascade = CascadeType.ALL, fetch = FetchType.EAGER,
mappedBy = "dormitorio")
Ma prima leggi la documentazione di JPA e comprendi cos'è il cascade.
Ti consiglio il libro "Java Persistence with Hibernate" (http://
www.manning.com/bauer2
)
In bocca al lupo