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:

  1. Odświeżyłem edytowany obiekt k (książka) - em.merge(k)
  2. 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ź.