Różne wersje encji - hibernate

0

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?

0

Moim zdaniem możesz zrobić tak jak uważasz ż jest "bez sensu". Dlatego że wtedy encja będzie cały czas zarządzana przez EntityMangera i będzie mógł wygenerować odpowiednie zapytanie. Druga opcja jest taka że po prostu możesz zrobić enuma i w bazie trzymać stringi z wartościami tego enuma lub konkretne id dla danego elementu tego enuma http://tomee.apache.org/examples-trunk/jpa-enumerated/README.html

0
Zaprogramowany napisał(a):

Dlatego że wtedy encja będzie cały czas zarządzana przez EntityMangera i będzie mógł wygenerować odpowiednie zapytanie.

Hmmm...wydaje mi się, że jeżeli istnieje możliwość zrobienia dwóch wersji encji to przy operacjach na bazie wszystko będzie zarządzane przez EntityManagera. Jeżeli jestem w błędzie to mnie popraw :)

Zaprogramowany napisał(a):

Druga opcja jest taka że po prostu możesz zrobić enuma i w bazie trzymać stringi z wartościami tego enuma lub konkretne id dla danego elementu tego enuma http://tomee.apache.org/examples-trunk/jpa-enumerated/README.html

Wolałbym mieć te wartości w bazie danych, ponieważ każdy użytkownik będzie miał możliwość dodawania swoich kategorii.

Tak jak pisałem wcześniej, szukam sprawdzonego rozwiązania. Jeżeli nic się nie znajdzie to będę próbował metodą "prób i błędów".

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