Wpis z mikrobloga

via Wykop Mobilny (Android)
  • 0
Cześć, próbuję w swoim małym projekcie oddzielić warstwę obiektów domenowych od encji, które są zapisywane do bazy danych i mam taki problem:

Przykład (używam JPA)

VisitEntity -> poza standardowymi typami prostymi (id, datę itp) przechowuje informacje o Doktorze (DoctorEntity).

DoctorEntity -> poza id, name itp ma kolekcję VisitEntity (mapowanie OneToMany).

Po odczytaniu z bazy chce te dane przekonwertować na obiekty domenowe Visit i Doctor i na nich oprzeć całą logikę. Jednak teraz natrafiłem na problem.

Podczas konwersji VisitEntity natrafiam na pole DoctorEntity i mapuje je konwerterem napisanym pod tę encję. Ten mapper natrafia na kolekcję VisitEntity i znów rozpoczyna konwersję, która znów później konwertuje Doktora. I tak w nieskończoność.

Co w takiej sytuacji jest dobrą praktyką?
Wywalić z domeny Doctor tę kolekcję i jej nie mapować po prostu?

#java #hibernate #ddd #programowanie #jpa
  • 7
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

@Rubajticos: Jak miałem taki problem to wyrzuciłem obiekt z kolekcji. Czyli tutaj masz DoctorEntity z listą wizyt ale wizyta już się nie odwołuje do doktora.

Działało. Ale pewnie da się to zrobić lepiej.
  • Odpowiedz
@oldwizzy: W sensie, że patrząc na mój przykład: W VisitEntity miałeś DoctorEntity z kolekcją VisitEntity -> po zmapowaniu Visit miało Doctor z kolekcją Visit, ale już na tym poziomie elementy kolekcji - Visit zamiast pełnego obiektu Doctor miały po prostu nulla?
  • Odpowiedz
@Rubajticos: narysuj to sobie na kartce i postaraj się tak pogupować dane, żeby unikąć cykli. Generalnie unikaj cykli zależności.
Pytanie, czy doktor w bazie danych musi mieć info o swoich wizytach? Jeśli potrzebujesz w domenie, to mozesz zrobić więcej niż jedno zapytanie zeby to wyciągnąć (zazwyczaj to ne problem). I zamiast JPA użyj czegoś ludzkiego ;)
  • Odpowiedz
via Wykop Mobilny (Android)
  • 0
@krasnoludkolo: W zasadzie nie potrzebuję tego w Doktorze, ale mapowanie Hibernate niejako to wymusza żeby po jednej stronie relacji był obiekt, a po drugiej kolekcja. I w zasadzie to jest chyba całym problemem.

Dlatego też właśnie pomyślałem, żeby w domenie Doktor tej listy po prostu nie miał. Zrobię tak jak mówisz, rozrysuję to sobie i może wykminię :)
  • Odpowiedz
@Rubajticos: JPA samo w sobie potrafi sobie poradzic z takim mapowaniem obustronnym. Wiec bys musial w swoim podejsciu zaimplementowac dokladnie te same mechanizmy lub skorzystac z kompozycji (detale kawalek dalej).
Natomiast DDD nie oznacza koniecznie rozdzielenia encji od obiektow domenowych w takim sensie ze to musza byc osobne klasy. Glownym postulatem jest nie pozwolenie na sytuacje gdzie model bazy danych narzuca strukture klasom. W kodzie nalezy modelowac domene tak jak
  • Odpowiedz
@Edhendil: Dzięki za wyczerpującą odpowiedź. Teraz to dla mnie jaśniejsze :) Spróbuję opcji nr 1, którą zaproponowałeś. Jeśli dobrze rozumiem - czysto teoretycznie jeśli w przyszłości chciałbym zamienić JPA np. na jakieś Monto to po prostu potrzebowalbym napisać drugą klasę, która implementowałaby interfejs tej domeny?
  • Odpowiedz