@Entity public class Autor {
..
@OneToMany(feth=FethType.EAGER, cascade = CascadeType.ALL)
private List<Ksiazka> ksiazki;
..}
@Entity public class Ksiazka {
..
@ManyToOne
private Autor autor;
..}
Chcę zmienić autora dla jakiejś kiążki. Czy powinienem robić to tak?
Czy można to zrobić jakoś prościej?
begin();
poprzedniAutor = ksiazka.getAutor();
lista = poprzedniAutor.getKsiazki();
lista.remove(ksiazka);
poprzedniAutor.setKsiazki(lista);
save(poprzedniAutor);
ksiazka.setAutor(nowyAutor);
lista = nowyAutor.getKsiazki();
lista.add(ksiazka);
nowyAutor.setKsiazki(lista);
save(nowyAutor);
commit();
close();
--
A|fer
begin();
ksiazka.getAutor().getKsiazki().remove(ksiazka);
ksiazka.setAutor(nowyAutor);
nowyAutor.getKsiazki().add(ksiazka);
commit();
close();
Nie trzeba robić save na obiektach pobranych z bazy, po zakończeniu
transakcji same się zaktualizują.
Jak również zupełnie niepotrzebne było to autor.setKsiązki(..). Ta lista
cały czas tam była.
Pozdrawiam
Jarek
> begin();
>
> ksiazka.getAutor().getKsiazki().remove(ksiazka);
>
> ksiazka.setAutor(nowyAutor);
> nowyAutor.getKsiazki().add(ksiazka);
>
> commit();
> close();
A nie wystarczy:
begin()
ksiazka.setAutor(nowyAutor);
commit();
close();
Bo jeśli dobrze sobie przypominam relacja one-to-many opiera się na tym,
że tabela książka ma klucz obcy autor_id. Aktualizując go aktualizujemy
listę.
Pozdrawiam
--
I've probably left my head... somewhere. Please wait untill I find it.
Homepage (pl_PL): http://uzytkownik.jogger.pl/
(GNU/)Linux User: #425935 (see http://counter.li.org/)
Z punktu widzenia bazy danych wystarczy. Ale chyba teoretycznie tak się
robić nie powinno, bo w obrębie tej transakcji dane będą niespójne. Tzn.
wowyAutor nie będzie miał w kolekcji tej książki. W OpenJPA o ile pamiętam
da się wymusić, żeby provider sam dbał o spójność takich powiązań, ale
hibernate tego nie robi. Oczywiście, jeżeli podczas zapisu hibernateowi się
nic nie pomiesza z powodu niespójności, to potem już będzie ok. Ja bym
jednak na wszelki wypadek kolekcje też uaktualnił.
Pozdrawiam
Jarek
OK. Lepiej znam teorię niż hibernate :)
wielkie dzięki