Witam.
Na początek powiem na jakiej platformie pracuje - TopLink + Serwer aplikacji Oracle + DB2.
W bazie mam tabele z książkami i autorami i pomiędzy tymi tabelami zachodzi relacja N:N.
Książka -----< KsiazkaAutor >----- Autor
Obiekt mapujący tabele książki posiada kolekcję przechowującą autorów. Kolekcja ta posiada adnotację "cascadeType = PERSIST" dzięki czemu mogę zrobić coś takiego w kodzie:
Ksiazka k = new Ksiazka();
k.addAutor(new Autor("Janek"));
k.addAutor(new Autor("Wacek"));
k.addAutor(new Autor("Staszek"));
em.persist(k); //zapisuję książkę do bazy
Czyli po zapisie książki (jednym poleceniem "em.persist(k)") dodatkowo TopLink doda mi 3 autorów do tabeli Autorzy i doda 3 rekory do tabeli wiążącej. Tu sprawa jest prosta.
Pytanie moje jest taki: Czy da się w podobny sposób (jednym poleceniem) usunąć jednego lub kilku z autorów ?
Na początku zrobiłem coś takiego:
- Odświeżyłem edytowany obiekt k (książka) - em.merge(k)
- Usunąłem z jego kolekcji wybranych autorów i wykonałęm polecenie em.persist(k)
O dziwo zadziałało ale tylko na poziomie serwera aplikacji (czyli tak naprawdę nie zadziałało). Dokładniej mówiąć gdy po takiej zmianie pytam się o autorów danej książki to serwer aplikacji zwraca mi kolekcję bez tych usuniętych autorów (czyli tak jak chciałęm). Jednak w bazie nadal utrzymywana jest ta relacja i jeśli zrestartuje serwer to przy kolejnym zapytaniu o autorów dostaje pełną ich listę również z tymi "usuniętymi" wcześniej.
Oczywiście rozwiązaniem na to jest jawne usuwanie wierszy w tabeli łączącej ale czy to jest konieczne ?
Czy nie można jakoś ospowiednio zamapować obiektu książki, tak żeby zawartość jej kolekcji autorów miała wpływ na zawartość wierszy w tabeli łączącej ?
Z góry dzięki za odpowiedź.