Настройка триггера Oracle перед вставкой и генератора идентификаторов Hibernate - PullRequest
2 голосов
/ 08 февраля 2012

У меня есть объект, который сохраняется в схеме Oracle.При вставке БД триггер генерирует идентификатор объекта, используя последовательность БД.Использование триггера обязательно , поскольку он также обновляет другую таблицу рядом с последовательностью генерации идентификаторов (вид таблицы журналов), что важно для устаревших компонентов.

Как настроить генератор идентификаторов Hibernate в моемсопоставление сущностей?

Оглядываясь на похожие вопросы Stackoverflow, я нашел несколько решений, которые не подходят для моего случая:

  1. Использование последовательности напрямую: <generator class="sequence">...</generator>.Это невозможно, поскольку остальная часть кода триггера не будет выполнена
  2. с использованием <generator class="select">...</generator>, что означает, что после вставки Hibernate выбирает объект, используя другое уникальное свойство (согласно руководству Hibernate-3.3 5.1.4.6.),Это также невозможно здесь, поскольку нет другого уникального столбца и использование набора свойств не поддерживается.
  3. Использование <generator class="assigned">...</generator> и установка поддельного идентификатора перед вызовом save().Этот идентификатор будет игнорироваться триггером БД, и результирующая строка БД будет иметь правильный идентификатор.Тем не менее, мой экземпляр Java не будет иметь, и это решение выглядит безобразно, поскольку он делает предположения о реализации триггера.

Есть ли хорошее решение для этой проблемы?

Ответы [ 2 ]

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

<generator class="select"> - более правильное решение. Тот факт, что вы не можете выбрать обратно автоматически сгенерированное значение, просто показывает проблему с моделью ypu и выбором генератора IMHO. Вы можете попробовать использовать <generator class="sequence-identity">, но, как я упомянул в javadocs (org.hibernate.id.SequenceIdentityGenerator (), по моему опыту, поддержка getGeneratedKeys в драйверах Oracle довольно неточна или, по крайней мере, вернулась несколько лет назад, когда я впервые разработал и испытал этот генератор.

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

Создание идентификатора и обновление других таблиц должны быть отдельными задачами.Вы можете использовать последовательность напрямую и только оставлять код «обновляет другие таблицы» в триггере.

Есть какая-то конкретная причина, почему это нельзя сделать?

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