Hibernate не сохраняет внешний ключ, но с junit все нормально - PullRequest
0 голосов
/ 09 ноября 2010

У меня странная проблема. В веб-приложении J2ee с spring, smartgwt и hibernate случается, что у меня есть класс A, у которого есть набор класса B, оба они сопоставлены с таблицей A и таблицей B.

Я написал простой тестовый пример для тестирования менеджера сервисов, который должен выполнять вставку, обновление, удаление и все работает, как ожидается, особенно во время вставки. В конце у меня есть одна запись в A и записи в B с внешним ключом к A.

Но когда я пытаюсь вызвать службу из веб-приложения, сущность в B сохраняется без ссылки на внешний ключ.

Я уверен, что услуга такая же. Одна вещь, которую я заметил, заключается в том, что при включении ведения журнала гибернации кажется, что когда служба вызывается из приложения, выполняется еще одно обновление:

  • вставка A
  • вставка B
  • обновление A
  • обновление B
  • обновление B (только внешний ключ)
  • обновление A <--- ??? </li>
  • обновление B <--- ??? </li>

Вместо этого при запуске тестового примера junit обновление выглядит следующим образом:

  • вставить A
  • вставка B
  • обновление A
  • обновление B
  • обновление B (только внешний ключ)

Полагаю, что последнее обновление вызывает ошибку, может быть, это перезапись значений. Учитывая, что приложение использует Spring, с хорошо известным механизмом DAO + Manager, где я могу исследовать, чтобы решить эту проблему? Кто-то сказал мне, что сессия не закрыта, поэтому hibernate сделает еще одно обновление, прежде чем сам выпустить объекты.

Я почти уверен, что все настройки hbm, xml и всего остального в порядке ... но я могу ошибаться.

1 Ответ

0 голосов
/ 09 ноября 2010

Просто угадайте: может быть, вы используете объекты после того, как вставили их?Hibernate сохраняет фактическое состояние памяти в момент времени, когда вы вызываете commit.Поэтому, если вы вызываете свой сервис, который вставляет объекты (вызывая session.save), но затем в вызывающем коде вы снова меняете сущности, вы заставляете Hibernate сделать еще одно обновление, чтобы сохранить ваши последние изменения.Проверьте объекты в памяти в конце транзакции.

...