как отключить генератор, когда триггер БД создает идентификатор - PullRequest
2 голосов
/ 12 мая 2011

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

[ОШИБКА] 05/12 / 11_09: 44: 20.54 [org.hibernate.event.def.AbstractFlushingEventListener] - Не удалось синхронизировать состояние базы данных с сеансом

Триггеры Db2 для генерации идентификатора должны оставаться на месте для поддержки устаревших приложений. Как я могу настроить hbm.xml, чтобы он не генерировал идентификатор?

1 Ответ

0 голосов
/ 19 мая 2011

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

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

<id name="id" type="long" column="person_id">
  <generator class="select">
    <param name="key">socialSecurityNumber</param>
  </generator>
</id>

Если в вашем сопоставлении уже определена запись натурального ключа, вам даже не нужно указывать параметр key для генератора.

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

Вы можете расширить org.hibernate.id.SelectGenerator или одного из его родителей, а затем реализовать выбор через несколько столбцов. Затем вы просто заменяете атрибут class вышеупомянутой записи генератора на полное имя класса вашего нового генератора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...