[Hibernate] Kilka pytań ...

0

Witam ,

Mam kilka pytań do ludzi bardziej doświadczonych w Hibernate.

  1. Jak przeciążacie metode equals() dla klas które będą zapisywane w bazie? Przy założeniu ze dodajemy pole id które jest generatorem. Czy equals() robicie jako równość id czy może porównuje się klucze biznesowe ? Proszę o jakieś nakreślenie tylko problemu.

  2. Mamy jakieś dane w bazie , i mamy jeszcze niepołączone z nimi obiekty. Czy aby połączyć obiekt z odpowiadajacym mu wierszem trzeba robić to tak:
    -dla danego obiektu i jego danych zrobic select sprawdzający czy jest juz ten obiekt w bazie ( moze tutaj przyda sie to equals() z pkt 1.) i potem majac juz id or null albo wywoluje session.update() albo session.save(). Można by użyć metody saveOrUpdate() ale dla danego obiektu nie wiem jakie ono ma id w bazie , a nie chciałbym tego robić na pałe selectem).

Proszę o jakieś wskazówki jak się to rozwiązuje.

Pozdrawiam

0
  1. Klucze biznesowe. Jest o tym nawet rozdzial w Java Persistence with Hibernate, King / Bernard
  2. Zakladam ze chodzi Ci o to ze masz obiekt Javowy ktory ma odpowiadajacy wiersz w bazie, i "podlaczenie" to znaczy ze chialbys aby ten obiekt wskazywal na ten wiersz? Jesli tak, to znaczy ze masz obiekt w stanie detached. Jest operacja merge() lub saveOrUpdate() wlasnie, ktore sluza do tego aby takie obiekty "podlaczyc", zwraca obiekt w stanie managed.
    Skad wziales taki niepodlaczony obiekt? Uzyles operatora new jak tworzyles (czyli ma puste id?) czy on jest z innej warstwy aplikacji i byl kiedystam wczytany za pomoca hibernate i jest detached (id bedzie mial ustatione). Jesli to pierwsze, to cos zle robisz, i zadna z metod nie zadziala - utworzy nowy obiekt w bazie.
    Jesli nie wiesz jaki jest id, to skad hibernate ma to wiedziec, i skad ma wiedziec jaki wiersz ma updatowac?
    Lepiej opisz skad bierzesz ten niepodlaczony obiekt i co chcesz zrobic, to ktos pewnie powie jak to zrobic poprawnie.
0
::. napisał(a)
  1. Klucze biznesowe. Jest o tym nawet rozdzial w Java Persistence with Hibernate, King / Bernard
  2. Zakladam ze chodzi Ci o to ze masz obiekt Javowy ktory ma odpowiadajacy wiersz w bazie, i "podlaczenie" to znaczy ze chialbys aby ten obiekt wskazywal na ten wiersz? Jesli tak, to znaczy ze masz obiekt w stanie detached. Jest operacja merge() lub saveOrUpdate() wlasnie, ktore sluza do tego aby takie obiekty "podlaczyc", zwraca obiekt w stanie managed.
    Skad wziales taki niepodlaczony obiekt? Uzyles operatora new jak tworzyles (czyli ma puste id?) czy on jest z innej warstwy aplikacji i byl kiedystam wczytany za pomoca hibernate i jest detached (id bedzie mial ustatione). Jesli to pierwsze, to cos zle robisz, i zadna z metod nie zadziala - utworzy nowy obiekt w bazie.
    Jesli nie wiesz jaki jest id, to skad hibernate ma to wiedziec, i skad ma wiedziec jaki wiersz ma updatowac?
    Lepiej opisz skad bierzesz ten niepodlaczony obiekt i co chcesz zrobic, to ktos pewnie powie jak to zrobic poprawnie.

Wielkie dzięki za odpowiedź.

Tak , obiekt ma puste id bo jest tworzony operatorem new z danych pobieranych od usera. Teraz chciałbym jakoś taki obiekt połączyć z wierszem tabeli tzn. jeżeli takie informacje już są w bazie (powiedzmy ze sprawdzać będziemy po name usera) to zeby dokonał update, a jeżeli NIE MA to zeby zrobił własnie save(). Oczwyście mogę to Id zdobyć właśnie jakimś zapytaniem w stylu "SELECT id FROM User WHERE name='ajoja17'; Ale myślałem , że jest coś ciekawszego i może szybszego w stylu dopisanie czegoś w pliku mapującym np o tym że name jest PRIMARY KEY i później , aby on sprawdził czy jeżeli nie łamie constrainta pk to aby dodało, a jak nie to updatowało.

Mam nadzieje ze teraz już wiesz o co mi chodzi ....

0

No updaty itp robione sa na podstawie klucza podstawowego. Jesli chcesz to mozesz zrobic aby tabela miala taki wlasnie klucz podstawowy, ale to kiepskie rozwiazanie - przeciez imiona sie powtarzaja. Z tego samego powodu dla podanego przez Ciebie przykladu, skad hibernate ma wiedziec o jakiego Rafała chodzi, ktorego m aupdatowac?
Bez wczesniejszego selecta sie nie obedzie. W ogole to dziwny masz workflow - nie powinno byc raczej takie?

  • pobierasz usera z bazy
  • pokazujesz w GUI ten obiekt, pozwalasz edytowac
  • na save robisz update
0
::. napisał(a)

No updaty itp robione sa na podstawie klucza podstawowego. Jesli chcesz to mozesz zrobic aby tabela miala taki wlasnie klucz podstawowy, ale to kiepskie rozwiazanie - przeciez imiona sie powtarzaja. Z tego samego powodu dla podanego przez Ciebie przykladu, skad hibernate ma wiedziec o jakiego Rafała chodzi, ktorego m aupdatowac?
Bez wczesniejszego selecta sie nie obedzie. W ogole to dziwny masz workflow - nie powinno byc raczej takie?

  • pobierasz usera z bazy
  • pokazujesz w GUI ten obiekt, pozwalasz edytowac
  • na save robisz update

Ok , thx za odpowiedz. Workflow jest w porządku , przykład z User wyglada nieco komicznie , ale jest on tylko dla przedstawienia problemu. Myślałem , że np klucze biznesowe + dobre metody equals() załatwią sprawę i ten select wywoła hibernate (select szukający wiersza w bazie który np. narusza constraint PK , czyli wiersza o tych samych wartościach na kluczu biznesowym), a nie ja.

0

Hibernate nie moze wiedziec co ma wtedy zrobic. W Twoim przypadku - update, a ja bym chcial w innej aplikacji zeby wywalal wyjatek, a jeszcze ktos inny aby dodawal nowy wiersz. Nie da sie wszystkiego na raz.

0
::. napisał(a)

No updaty itp robione sa na podstawie klucza podstawowego. Jesli chcesz to mozesz zrobic aby tabela miala taki wlasnie klucz podstawowy, ale to kiepskie rozwiazanie - przeciez imiona sie powtarzaja. Z tego samego powodu dla podanego przez Ciebie przykladu, skad hibernate ma wiedziec o jakiego Rafała chodzi, ktorego m aupdatowac?
Bez wczesniejszego selecta sie nie obedzie. W ogole to dziwny masz workflow - nie powinno byc raczej takie?

  • pobierasz usera z bazy
  • pokazujesz w GUI ten obiekt, pozwalasz edytowac
  • na save robisz update

A jak chcę dodać nowego usera?
Dane typu imie, nazwisko itp pobieram z formatki, a załóżmy że kluczem jest id_usera. Czy da się to zrobić w jakiś inny sposób czy trzeba najpierw zapytać o ostatnie id, zwiększyć o 1, podstawić w beanie i save().???

0

Ja bym zrobil tak: dodajesz nowego usera, czyli nie bedzie zadnego id, zakladasz wariant optymalny ze usera ktory by byl taki sam (login) jeszcze nie ma. Jesli jest, to hibernate zwroci wyjatek (jesli bedzie np. zalaozony indeks unique na login), ty go lapiesz i pokazujesz. To wszystko.

1 użytkowników online, w tym zalogowanych: 0, gości: 1