Zasadniczo mam kilka obiektów w tej konfiguracji (rzeczywisty model danych jest nieco bardziej złożony):
- A ma relację wiele do wielu z B. (B ma
inverse="true"
) - B ma relację „wiele do jednego” z C. (mam
cascade
ustawione"save-update"
) - C jest rodzajem tabeli typów / kategorii.
Powinienem również wspomnieć, że klucze podstawowe są generowane przez bazę danych przy zapisywaniu.
W przypadku moich danych czasami napotykam problemy, w których A ma zestaw różnych obiektów B, a te obiekty B odnoszą się do tego samego obiektu C.
Kiedy zadzwonić session.saveOrUpdate(myAObject)
, dostaję hibernacji błąd mówiąc: "a different object with the same identifier value was already associated with the session: C"
. Wiem, że hibernacja nie może wstawić / zaktualizować / usunąć tego samego obiektu dwa razy w tej samej sesji, ale czy jest jakiś sposób na obejście tego? Nie wydaje się, żeby była to taka niezwykła sytuacja.
Podczas moich badań nad tym problemem widziałem, jak ludzie sugerowali użycie programu session.merge()
, ale kiedy to robię, wszelkie "sprzeczne" obiekty są wstawiane do bazy danych jako puste obiekty ze wszystkimi wartościami ustawionymi na zero. Najwyraźniej nie tego chcemy.
[Edytuj] Kolejną rzeczą, o której zapomniałem wspomnieć, jest to, że (z powodów architektonicznych, na które nie mam wpływu), każdy odczyt lub zapis trzeba wykonać w osobnej sesji.