Witam, podczas pisania aplikacji napotkałem pewien problem, nad którym cały czas myślę i nie mogę zdecydować co robić. Dodam, że całość jest robiona na Spring MVC + Hibernate + MySQL.
Wracając do problemu, mam encję reprezentującą kartę. Karta posiada swój typ oraz kategorię. W bazie danych są to klucze obce kolejno z tabel card_type oraz card_category.
W aplikacji każdą encje reprezentuje inna klasa, która jest odwzorowaniem rekordu z bazy danych (Card, CardType, CardCategory). O ile z CardType oraz CardCategory nie miałem większych problemów o tyle z Card już mam.
@OneToOne
@NotNull
@JoinColumn(name = "FK_CARD_CATEGORY_ID")
private CardCategory category;
@OneToOne
@NotNull
@JoinColumn(name="FK_CARD_TYPE_ID")
private CardType type;
Mógłbym pola category oraz type zrobić Integer (tak jak jest to w bazie danych), ale użycie relacji 1:1 (taka logika) oraz klas dla typu i kategorii ułatwia mi życie np. przy pobieraniu danych.
Wszystko ładnie pięknie do momentu, aż chcę dodać nowy obiekt. W formularzu dodawania POST'em przesyłam tylko id typu oraz kategorii (zwykłe selecty).
Przy w/w rozwiązaniu chcąc utworzyć nowy obiekt Card muszę najpierw pobrać/utworzyc odpowiednio obiekty typu, kategorii, ustawić je w obiekcie karty, a następnie zapisać kartę. Trochę bez sensu - no bo pobieranie obiektu, tylko po to żeby go ustawić w innym obiekcie, który wykorzysta z tego pobranego tylko id wg. mnie nie ma sensu.
Wymyśliłem, że mógłbym utworzyć klasę bazową dla obu wersji jednej encji, a następnie w jednej klasie pochodnej zrobić category oraz type jako Integer, a w drugiej jako CardCategory i CardType. Wtedy w kodzie musiałbym żonglować tymi typami w zależności od przeznaczenia.
Czy takie rozwiązanie się sprawdzi? Czy ktoś z Was miał podobny problem? Jak sobie z tym poradziliście?