По существу у меня есть некоторые объекты в этой конфигурации (реальная модель данных немного сложнее):
- A имеет отношение "многие ко многим" с B. (B имеет
inverse="true"
) - B имеет многозначную связь с C. (У меня
cascade
установлено значение"save-update"
) - C - это тип таблицы типов/категорий.
Кроме того, я должен, вероятно, упомянуть, что первичные ключи генерируются базой данных при сохранении.
С моими данными я иногда сталкиваюсь с проблемами, когда A имеет множество разных B-объектов, и эти объекты B относятся к одному и тому же объекту C.
Когда я вызываю session.saveOrUpdate(myAObject)
, я получаю ошибку спящего режима: "a different object with the same identifier value was already associated with the session: C"
. Я знаю, что спящий режим не может вставлять/обновлять/удалять один и тот же объект дважды в одном сеансе, но существует ли какой-то способ этого? Это не похоже, что это было бы редкостью ситуации.
Во время моего исследования этой проблемы я видел, как люди предлагают использовать session.merge()
, но когда я это делаю, любые "конфликтующие" объекты вставляются в базу данных в виде пустых объектов со всеми значениями, равными нулю. Ясно, что это не то, что мы хотим.
[Edit] Еще одна вещь, о которой я забыл упомянуть, заключается в том, что (по причинам, не зависящим от архитектуры) каждое чтение или запись необходимо выполнять в отдельном сеансе.