Я храню относительно сложный неизменяемый объект в базе данных. Существует много ассоциаций типа «многие к одному» - у объекта есть свойства, которые имеют свойства и так далее.
Я бы хотел, чтобы каждый объект хранился только один раз, исходя из бизнес-ключа, который в данном случае является каждым отдельным свойством объекта.
Рабочий процесс выглядит так:
- пользователь создает сложный объект. Это может занять много времени, код разбросан повсюду.
- Я запрашиваю базу данных, чтобы узнать, был ли точно такой же объект уже сохранен ранее:
- если нет,
save
- если да, установить идентификатор объекта и
merge
Проблема в том, что merge
в Hibernate имеет довольно неудобную семантику:
transientObject = createComplexTransientObject();
mergedObject = session.merge(transientObject);
// here you have to discard transientObject
// use mergedObject from now on
Созданный объект должен быть отброшен и заменен на объект, предоставленный Hibernate, что означает, что я должен обновить все ссылки на него.
Мне нужен способ сказать hibernate: «Этот совершенно новый transientObject кажется идентичным тому, который уже находится в базе данных. Объедините его на месте» Другими словами:
object = createComplexTransientObject();
session.inPlaceMerge(object);
// object is now persistent
Как мне этого добиться?