Настройка триггера Oracle перед вставкой и генератора идентификаторов Hibernate
У меня есть объект, который сохраняется в схеме Oracle. При вставке БД триггер генерирует идентификатор объекта с использованием последовательности БД. Использование триггера является обязательным, поскольку он также обновляет другую таблицу рядом с последовательностью генерации идентификатора (вид таблицы журнала), что важно для устаревших компонентов.
Как настроить генератор идентификаторов Hibernate в моем сопоставлении сущностей?
Оглядываясь на похожие вопросы Stackru, я нашел несколько решений, которые не подходят для моего случая:
- Используя последовательность непосредственно:
<generator class="sequence">...</generator>
, Это невозможно, потому что остальная часть кода триггера не будет выполнена - С помощью
<generator class="select">...</generator>
Это означает, что после вставки Hibernate выбирает объект, используя другое уникальное свойство (согласно руководству Hibernate-3.3 5.1.4.6.). Это также невозможно здесь, потому что нет другого уникального столбца и использование набора свойств не поддерживается. - С помощью
<generator class="assigned">...</generator>
и установка поддельного идентификатора перед звонкомsave()
, Этот идентификатор будет игнорироваться триггером БД, и результирующая строка БД будет иметь правильный идентификатор. Тем не менее, мой экземпляр Java не будет иметь, и это решение выглядит уродливо, поскольку он делает предположения о реализации триггера.
Есть ли хорошее решение этой проблемы?
2 ответа
Генерация идентификатора и обновление других таблиц должны быть отдельными задачами. Вы можете использовать последовательность напрямую и только оставлять код "обновляет другие таблицы" в триггере.
Есть какая-то конкретная причина, почему это нельзя сделать?
<generator class="select">
это более правильное решение. Тот факт, что вы не можете выбрать обратно автоматически сгенерированное значение, просто показывает проблему с моделью ypu и выбором генератора IMHO. Вы можете попробовать использовать <generator class="sequence-identity">
, но, как я упоминал в javadocs (org.hibernate.id.SequenceIdentityGenerator(), по моему опыту, поддержка getGeneratedKeys в драйверах Oracle довольно ненадежна или, по крайней мере, вернулась несколько лет назад, когда я впервые разработал и протестировал этот генератор.