У мене по суті є деякі об'єкти в цій конфігурації (реальна модель даних трохи складніша):
- А має стосунки багато-до-багатьох з Б. (У має
inverse="true") - B має багато-до-одного стосунки з C. (я
cascadeвстановив"save-update") - С - це своєрідна таблиця типів / категорій.
Також, мабуть, слід згадати, що первинні ключі генеруються базою даних при збереженні.
Зі своїми даними я іноді стикаюся з проблемами, коли A має набір різних об'єктів B, і ці об'єкти B посилаються на один і той же об'єкт C.
Коли я телефоную session.saveOrUpdate(myAObject), у мене виникає сплячий режим з помилкою: " "a different object with the same identifier value was already associated with the session: C". Я знаю, що сплячий режим не може вставити / оновити / видалити один і той самий об’єкт двічі за один і той же сеанс, але чи є якийсь спосіб обійти це? Це не здається, що це було б настільки незвичним явищем.
Під час мого дослідження цієї проблеми я бачив, як люди пропонують використовувати session.merge(), але коли я це роблю, будь-які "конфліктуючі" об'єкти вставляються в базу даних як порожні об'єкти з усіма значеннями, що мають значення null. Очевидно, що це не те, що ми хочемо.
[Редагувати] Ще одне, про що я забув згадати, - це те, що (з архітектурних причин, не залежних від мене), кожне читання чи запис потрібно робити в окремій сесії.