2

У меня есть сущность, которая сохраняется в схеме Oracle. В вставке DB триггер генерирует идентификатор объекта с использованием последовательности БД. С помощью триггера обязательно, так как он также обновляет другую таблицу рядом с последовательностью генерации идентификатора (вид таблицы журналов), что важно для устаревших компонентов.Oracle before-insert trigger и Hibernate id generator setting

Как настроить генератор идентификаторов 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(). Этот идентификатор будет проигнорирован триггером DB, и в результате в результате строки DB будет иметься правильный ID. Тем не менее, мой экземпляр Java не будет иметь, и это решение требует уродливости, поскольку оно делает предположения о реализации триггера.

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

+0

Что означает личность? Он возвращает вставленный идентификатор – Firo

+1

Что-то звучит с помощью этого триггера БД. Его нужно записать, чтобы получить только значение последовательности, если оно не указано во вставке, например, 'IF: new .pk_id IS NULL THEN SELECT my_seq.NEXTVAL INTO: new.pk_id FROM DUAL; END IF; '- тогда остальная часть триггера может использовать идентификатор, независимо от того, была ли она предоставлена ​​триггером или спящим режимом. –

+0

OK, извините, никогда ответив на это: @Firo: 'identity 'не поддерживается для Oracle (http://www.roseindia.net/hibernate/hibernateidgenera torelement.shtml) – rainer198

ответ

0

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

Любые особые причины, по которым это невозможно сделать?

+0

По крайней мере, триггер должен быть выполнен, так как он обновляет другую таблицу (см. Мой комментарий сегодня). С другой стороны, я не могу изменить код запуска, поскольку другие приложения ожидают, что триггер вызывает последовательность. – rainer198

+0

Вы можете изменить триггер только для заполнения идентификатора, если он равен NULL. Затем он может также использоваться другими приложениями. – jva

0

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

+0

Ну, как я описал, у меня нет другого уникального столбца, который можно было бы использовать для этого выбора sequenz, и комбинация не поддерживается. – rainer198

+0

Комбинация * есть * поддерживается. Отметьте свойства, которые вы хотите использовать в качестве уникального ключа для последующего поиска, как @NaturalId, и генератор выбора будет автоматически использовать это для получения первичного ключа. Моя точка зрения была просто в том, что это, опять же ИМХО, является плохой базой данных. И второе мое мнение заключалось в том, что в вашем списке отсутствует номер параметра (4), который должен был бы использовать '' –

+0

@SteveEbersole Under Hibernate 3.6.10, пытаясь использовать 'select' генератор с несколькими столбцами, аннотированный как '@ NaturalId', создает' org.hibernate.id.IdentityGenerationException: выбор генератора в настоящее время не поддерживает составные свойства natural-id; необходимо указать [ключ] в параметрах генератора'. Можете ли вы уточнить, какая версия Hibernate поддерживает эту стратегию генератора с составным естественным ключом? – Tim

Смежные вопросы