Wpis z mikrobloga

Mirki,
mamy przykładowe klasy:

class Foo{
String fooName;
}

class Bar{
String barName;
Foo foo;
}

i usługi:

class FooService{
Foo getById(long id){};
Foo store(Foo foo){}
}

class BarService{
Bar getById(long id){};
Bar store(Bar bar){}
}

Jakiego efektu spodziewacie się po wykonaniu kodu:

Bar bar = barService.getById(666);
bar.setBarName("new bar name");
bar.getFoo().setFooName("new foo name");
barService.store(bar);

Tzn. oczywiście utrwalone w bazie będzie barName, ale czy powinno być utrwalone też fooName, czy użytkownik tych klas powinien sam zadbać o oddzielne wykonanie fooService.store(bar.getFoo()) ?
Mam nadzieję, że nie zamotałem za bardzo :D
#programowanie #designpatterns #java #naukaprogramowania
  • 5
@lol_nope: Zależy od tego, czy Foo i Bar są już zapisane w bazie i czy metoda store() służy do zapisu, czy aktualizacji. Jeżeli store() aktualizuje i oba obiekty są już w bazie, to zmiany wykonane w Foo "poprzez" Bar również powinny być uwzględniane.
@Eoghan: store() generalnie ma za zadanie zapisać, jeżeli obiekt nie istnieje w bazie, lub zaktualizować jeżeli istnieje. Chyba jednak pójdę w strone olewania tego, co jest w Foo tak, jak pisze @teherty. Zawsze lepiej w controllerze dopisać linijkę z zapisem Foo, niż potem w razie czego się zastanawiać jak tego NIE zapisywać...
@lol_nope: z Twojego opisu wynika, jakbyś wynajdował na nowo Hibernate (opisujesz działanie metody merge), a tam działa to właśnie tak, że zapisywany jest obiekt wraz z całym drzewem powiązań. Narzucanie sobie konieczności wstrzykiwania kilku serwisów wydaje mi się nielogiczne, bo skoro ktoś zrobił tam zmianę to nie dlatego że sobie robi żarty i testuje co się stanie, tylko po prostu chce coś zmienić
opisujesz działanie metody merge


@Eoghan: Tak, wynika to z tego, że chcę zachować 100% izolacji domeny od persystencji, więc encje domenowe są oddzielnymi klasami od encji z Jpa. Metody store() w service (właściwie to powinny się chyba nazywać repository, a nie service) budują z obiektów domenowych obiekty Jpa i przekazują je do saveAndFlush z JpaRepository ze Spring-data.
Generalnie chyba masz rację - zrobię pełny zapis.
Tak przy okazji - to dobre