Настройка триггера Oracle перед вставкой и генератора идентификаторов Hibernate

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

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

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

  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 ответа

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

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

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

Другие вопросы по тегам