Relacje, jOOQ - najlepsze podejście

2

Cześć,
zacząłem sobie klepać projekt (tak z ciekawości do nowych technologii) w jOOQ, vavrze i Ratpack'u. Tak więc zacząłem sobie tworzyć encje bazodanowe + obiekty domenowe. No i tutaj zaczynają się pytania:

  1. Jak najlepiej tworzyć relacje ManyToMany lub OneToMany bez ORM'ów? Przy OneToMany trzymać po prostu to na zasadzie List<UUID> w jednej encji i UUID w drugiej? Natomiast potem to rozwiązywać SimpleFlatMapperem? Nie ma jakiegoś ładniejszego wyjścia? Jeśli już tak muszę to odzwierciedlać to jako FK na tabelach bazy? W ManyToMany jak rozumiem często nie trzeba obustronnego trzymania danych i wystarczy trzymać taką listę po jednej stronie, ew. robić tak jakby 2x OneToMany? Ciekawi mnie jak najlepiej w takich aplikacjach podchodzić do właśnie spraw relacji i mapowania obiektów na tabele bez użytku ORM'ów.
2

jOOQ nie jest do złożonych struktur danych (czyli kiedy chcesz całe złożone obiekty zapisywać do bazy) i o tym pisze nawet sam twórca jOOQ.

Jeśli chcesz robić jakieś proste obiekty z np jedną relacją to po prostu składasz to joinem i potem mapujesz

0

Tak więc jeśli mam sytuację gdzie no wydaje mi się, że muszę gdzieś taką listę powiązań między obiektami trzymać to bez jakichś ORM'ów się nie obejdzie?

2

Podaj konkretny przykład problemu. Może da sie do niego podejść od innej strony. Wszystko sie da zrobić bez ORMów

0

No np. mam jakąś określoną bazę zawodników(initial, zmiany zajdą tylko gdy zawodnik opuści/dojdzie do klubu w trakcie sezonu), użytkownik tworzy swój zespół wybierając 15 z nich. Co np. dwa dni może dokonać roszady w swoim zespole, bo uznał, że popełnił błąd. No tak więc przydałoby się żeby Team trzymał listę takich Player, bo na podstawie tego będą zliczane punkty, który zdobywa Team user'a, a dokładniej zawodnicy których wybrał.

e; ogólnie zamysł tego co chcę zrobić to była całkowita próba oderwania się od JPA/Spring'a żeby ujrzeć inny świat :D

1

@danek: sądze że akurat natywne SQLki sa najlepsze do selectów. ORM może się przydac bardziej przy aktualizacji

1

I do której z tych operacji potrzebujesz pierdycznego obiektu team z pierdyczną listą players?

0

Do tego, że ten użytkownik mając swój Team będzie mógł w każdym momencie podejrzeć swoich graczy, inni gracze również. Tak więc jak inaczej mogę trzymać to, że zespół tego użytkownika ma obecnie takich grajków i tyle punktów?

1

@scibi92: jak najbardziej. zwłaszcza jak chcesz zrobić takiego selecta "z boku".

@lavoholic bardzo dobra decyzja ;)

Przede wszystkim pamiętaj ze teraz nie masz opcji wyciągnięcia całego obiektu, a jedynie precyzyjnie podmieniasz te wartości, które akurat potrzebujesz.

Jeśli chodzi o samo tworzenie relacji, no to normalnie klucze obce itp

2

Nie bardzo widze w czym problem. Potrzebujesz podejrzeć grajków w danym teamie to zwykły select wystarczy:

team.players() -> jooq.selectFrom(players).where(team_id == id)
0

Ba, tutaj to byłby nawet jakiś M:N, bo w zasadzie każdy zawodnik może być wybrany przez wielu teamów, ale jeden team ma wiele zawodników. No i tutaj zastanawiam się jak robić taki insert? Załóżmy, że tworzę Team z piętnastoma zawodnikami od razu.

1

to juz musisz(?) miec jakas tabelke pomocnicza typu team_player z team_id i player_id. Tworzysz team, tworzysz playera i potem tworzysz relacje.

Coś jak:
Team: jooq.insert(team)
Player: jooq.insert(player1), player2...
Relacja: jooq.insertInto(team_player).columns(team_id, player_id).values(teamId, playerId1).values(teamId, playerId2) itp

1

W sumie wiele mi się wyjaśniło gdy nagle mnie oświeciło, że przecież to będzie relacja ManyToMany, a nie OneToMany jak myślałem wcześniej :D

Dzięki za pomoc.

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