Hibernate идентифицирует объекты по первичному ключу. Таким образом, если эти два дочерних элемента имеют один и тот же первичный ключ, который должен быть сгенерированным бизнесом ключом, Hibernate будет знать, что это один и тот же объект. НО, он все еще не знает, следует ли ему выполнить обновление или вставку в базу данных. Вы можете явно merge
вызвать дочерний объект, Hibernate будет искать его в базе данных и либо создавать, либо обновлять его.
НО, это не так просто, как это:
Одной из проблем является ключ, генерируемый бизнесом. Лучше позволить Hibernate генерировать суррогатные ключи.
Другая проблема заключается в необходимости использовать merge
, который должен использоваться всегда, если этот класс хранится. Подумайте об удалении каскада, потому что вы все равно должны его явно хранить.
Обратите внимание, что merge
возвращает другой экземпляр, который необходимо использовать. (это означает: присвойте возвращаемое значение merge
свойству родителя.)
Корневая проблема , которую вы получили, заключается в том, что бизнес-логика создает один и тот же объект дважды. Если вы хотите повторно использовать экземпляр, созданный кем-то другим, вам нужно получить его, либо выполнив поиск в базе данных, либо передав его в качестве аргумента. Попробуйте решить проблему следующим образом, прежде чем пытаться решить проблему.