Хранение только отдельных значений в таблицах с использованием Hibernate - PullRequest
1 голос
/ 07 августа 2010

Я храню относительно сложный неизменяемый объект в базе данных. Существует много ассоциаций типа «многие к одному» - у объекта есть свойства, которые имеют свойства и так далее.

Я бы хотел, чтобы каждый объект хранился только один раз, исходя из бизнес-ключа, который в данном случае является каждым отдельным свойством объекта.

Рабочий процесс выглядит так:

  • пользователь создает сложный объект. Это может занять много времени, код разбросан повсюду.
  • Я запрашиваю базу данных, чтобы узнать, был ли точно такой же объект уже сохранен ранее:
    • если нет, 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

Как мне этого добиться?

1 Ответ

0 голосов
/ 24 июля 2012

Я считаю, что saveOrUpdate делает именно то, что вы хотите.Но его поведение также зависит от вашего отображения.

Если вы делаете saveOrUpdate, дает ли он ожидаемые вами результаты?


Немного не по теме: знаете ли вы о QueryПримером?http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/querycriteria.html#querycriteria-examples


Неважно.Я просто вижу, что этому вопросу два года.Опция глупых «связанных вопросов» в stackoverflow.

...