Na forum 4programmers.net korzystamy z plików cookies. Część z nich jest niezbędna do funkcjonowania
naszego forum, natomiast wykorzystanie pozostałych zależy od Twojej dobrowolnej zgody, którą możesz
wyrazić poniżej. Klikając „Zaakceptuj Wszystkie” zgadzasz się na wykorzystywanie przez nas plików cookies
analitycznych oraz reklamowych, jeżeli nie chcesz udzielić nam swojej zgody kliknij „Tylko niezbędne”.
Możesz także wyrazić swoją zgodę odrębnie dla plików cookies analitycznych lub reklamowych. W tym celu
ustaw odpowiednio pola wyboru i kliknij „Zaakceptuj Zaznaczone”. Więcej informacji o technologii cookie
znajduje się w naszej polityce prywatności.
Mam dwie encję User i Task w relacji OneToMany. Chciałbym z metody, która dodaje taska do usera zwracać id tego taska, ale zwracany jest null (id w bazie zapisuje się normalnie).
Jeśli nie masz konieczności generowania ID przez bazę proponowałbym robić to z poziomu aplikacji. Nie będziesz miał wtedy problemu, a encje będą też mogłby być niemutowalne.
@VeloxDigitis: Chcę używać id generowanego przez bazę, bo to prostka apka i sensowniej w niej jest używać id typu 1,2 itd. niż kilkunastu znakowych uuidów.
Myślałem jeszcze, żeby użyć po prostu oddzielnego repo dla tasków. Wtedy przy zapisie zwracany byłby task z już wygenerowanym id. Co o tym sądzisz?
Jeśli nie masz konieczności generowania ID przez bazę proponowałbym robić to z poziomu aplikacji. Nie będziesz miał wtedy problemu, a encje będą też mogłby być niemutowalne.
@VeloxDigitis: Chcę używać id generowanego przez bazę, bo to prostka apka i sensowniej w niej jest używać id typu 1,2 itd. niż kilkunastu znakowych uuidów.
Myślałem jeszcze, żeby użyć po prostu oddzielnego repo dla tasków. Wtedy przy zapisie zwracany byłby task z już wygenerowanym id. Co o tym sądzisz?
Pozwól mi wejść miedzy wódkę i zakąski ...
Robiłem nie takie małe projekty w JPA, i nigdy nie pojawiła się POTRZEBA znajomości ID (oczywiście jest znana po zapisie)
JPA całkiem dobrze zapisuje sieci powiązanych OBIEKTOWO obiektów, wystarczy mu nie przeszkadzać.
Może się wcinam między j/w, ale nie ściągnąłeś sobie problemu sam?
Na przykład przez niby używanie Hibernate z myśleniem SQL-owym (zawsze dziwne dla mnie) , w szczególności property wskazujące na "ten drugi obiuekt" nie obiektowe, a integer ?
Mówię o
Kopiuj
classTask{int userId;}
vs
Kopiuj
classTask{User user;;}
Wyższym stadium tej samej choroby są zbyt poszatkowane repozytoria, to tylko sposób na pogłębienie prblemu.
Jak chcieć kompletować grupy rekordów ręcznie, panować nad tym na sposób SQL-a - ja bym użył innego toola niż Hibernate, niskopoziomowego mappera
Ale skąd Ty chcesz mieć to id? Przeciez to nie może działać. Przecież w czasie transakcji task będzie widziany jako obiekt w stanie Transient. Ten spoósb nie działa, po prostu.
Nie ma takiego stanu jak Transient :) w czasie transakcji obiekt będzie w stanie New przed „persist()” i Managed po. Gdyby w tej transakcji było jakieś query, to context byłby zflushowany do bazy i w teorii mógłby się ten ID wygenerować.
Możesz też spróbować zwrócić encje Task i gdzieś “wyżej” zrobić konwersję do dto. Możesz również spróbować użyć TransactionTemplate i ręcznie wykonać transakcję.