Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

hibernate one-to-many - czy tak?

54 views
Skip to first unread message

A|fer

unread,
Sep 11, 2007, 5:35:52 AM9/11/07
to
jest sobie klasa Autor i Ksiazka

@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

Jarek

unread,
Sep 15, 2007, 7:10:18 PM9/15/07
to
Powinno wystarczyć tak:

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

Maciej Piechotka

unread,
Sep 16, 2007, 4:43:55 AM9/16/07
to
On Sun, 16 Sep 2007 01:10:18 +0200, Jarek wrote:

> 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/)

Jarek

unread,
Sep 18, 2007, 8:15:17 AM9/18/07
to

>
> 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ę.
>

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

Maciej Piechotka

unread,
Sep 18, 2007, 12:42:36 PM9/18/07
to

OK. Lepiej znam teorię niż hibernate :)

A|fer

unread,
Sep 18, 2007, 6:10:12 PM9/18/07
to

wielkie dzięki

0 new messages