Obejrzałem sobie ten wykład
Podoba mi się podejście do pakietu jako do hermetycznego komponentu z pojedynczym interfejsem dostępu w postaci fasady, ale po długim używaniu podejścia package by layer(pakiety typu: controller, service, entity, repository) czegoś nie rozumiem. Mianowicie relacji między encjami bazodanowymi.
W prezentacji ukazany jest przykład takiego feature'a
Z tego co rozumiem Article jest klasą mapowaną na encję bazodanową. W klasycznym podejściu warstwowym, gdzie wszystkie encje są publiczne prawdopodobnie Article by wyglądało mniej więcej tak (Hibernate):
@Entity
public class Article {
@Id
Long id;
String title;
String content;
// jakies inne kolumny...
@OneToOne
Category category;
@OneToOne
User author;
@OneToMany
List<Tag> tags;
}
klasy Category, User, Tag to również encje w rozumieniu bazy danych.
Jednak w momencie, gdy dzielimy kod na zamknięte pakiety, a encje są schowane przed dostępem spoza pakietu sprawa się komplikuje. Tworząc encję Article nie mam dostępu do encji Category, User, Tag. Przecież są ukryte w swoich pakietach... A tworząc pakiet "entities" z publicznymi encjami tracimy w zasadzie wszystkie plusy architektury package by feature.
Tak jak encje Category lub Tag można by jeszcze umieścić pod domeną "article", to User jest encją uniwersalną i raczej wykorzystywaną w innych miejscach systemu i raczej będzie miał swój własny pakiet "user". Stąd 2 pytanka:
- W jaki sposób rozwiązuje się taki problem w tego typu architekturach? Czy rezygnujemy całkowicie z kluczy obcych i dobrodziejstw ORMa, przechowując np. id Usera/Kategorii, a gdy potrzebujemy się do ich informacji dostać używamy UserFacade.findByName(article.getAuthorName())?
@Entity
public class Article {
// ...
@OneToOne
Long categoryId;
@OneToOne
String authorName;
}
- Czy znacie jakieś open source projekty, w których używana byłaby tego typu architektura? Koniecznie żeby to był w miarę dojrzały projekt, a nie jakiś hello world z dwoma pakietami. Chciałbym zobaczyć jak się rozwiązuje problemy tej architektury na żywym organizmie. Najlepiej gdyby projekt był w stacku Spring+Hibernate.