У меня есть отображение гибернации для некоторого Clazz и отношение «многие к одному» для него:
<property name = "entityId" column = "ENTITY" type = "java.lang.Long"/>
<many-to-one name = "entity" column = "ENTITY" class = "Entity" insert = "false" update = "false"/>
Как сказано в документация сообщества :
update, insert (optional - defaults to true): specifies that the mapped columns should be included in SQL UPDATE and/or INSERT statements. Setting both to false allows a pure "derived" property whose value is initialized from some other property that maps to the same column(s), or by a trigger or other application.
Итак, затем я пытаюсь обновить класс с новой сущностью, я просто устанавливаю новое поле entityId и вызываю session.saveOrUpdate(clazz) - все работает, как и ожидалось, и новая сущность устанавливается в БД.
Но если я попытаюсь установить значение null (удалить отношение Clazz <-> Entity), используя
clazz.setEntityId(null)
тогда соответствующий COLUMN в БД не обновляется, и при получении следующей записи я все равно получаю старый ненулевой объект.
Для эксперимента я также попытался установить для объекта сущности значение null (clazz.setEntity(null)) и — сюрприз! - это сработало!
Почему происходят такие вещи? Является ли установка нуля не равной обновлению для Hibernate?
Дополнительно: на уровне БД у меня нет триггерных механизмов, влияющих на это свойство.
Hibernate версия - 3.6.10.Final
OpenJDK 1.8.0_191
Боюсь, теперь я не могу обновить спящий режим и/или использовать аннотации вместо xml-mapping. Знаете, иногда бывают и легаси-проекты)




Во-первых, вы должны использовать более новую версию спящего режима. Второе: перейти к аннотациям. их намного легче читать. В-третьих: если вы не используете последовательность/идентификатор для идентификатора, идентификатор всегда должен иметь значение