Как установить имя схемы для последовательностей во время развертывания при использовании JPA? - PullRequest
5 голосов
/ 15 октября 2010

По соображениям безопасности наши объекты oracle db обычно относятся к другой схеме, чем зарегистрированный пользователь. Например. таблицы находятся в xx_core, а пользователь, в который мы входим, - xx_app_yy. В моем файле persistence.xml я определяю файл orm, чтобы можно было указать имя схемы во время развертывания, например: <mapping-file>xx_schema_orm.xml</mapping-file>

Тогда в xx_schema_orm.xml я могу определить схему-объект-владение, например ::10000

<persistence-unit-metadata>
  <persistence-unit-defaults>
    <schema>xx_core</schema>
  </persistence-unit-defaults>
</persistence-unit-metadata>

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

2010-10-14 03:04:05,423:DEBUG   could not get next sequence value [select xx_SEQ.nextval from dual]     - org.hibernate.util.JDBCExceptionReporter
java.sql.SQLException: ORA-02289: sequence does not exist

    at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:145)

Я пытался установить имя схемы как часть имени последовательности для генератора в xx_schema_orm.xml, но не смог заставить его работать, например ::

<sequence-generator name="xx_SEQ_GEN"
sequence-name="xx_core.xx_SEQ"/>

Обходные пути, которые я могу попробовать:

  • сделать базу данных SYNONYM для последовательностей в схеме пользователя.
  • прекратить использование последовательностей и использовать другой способ генерации идентификаторов.

Ответы [ 2 ]

4 голосов
/ 15 октября 2010

В JPA 2.0:

  • аннотация @SequenceGenerator и эквивалентный элемент sequence-generator позволяют указывать schemacatalog) имя .
  • субэлемент schema также должен соблюдаться генераторами последовательностей .

Но это не относится к JPA 1.0.

Я просто процитирую разделы о подэлементе schema, чтобы проиллюстрировать различия (другие соответствующие разделы упомянуты в ссылках ниже). Из спецификации JPA 2.0:

12.2.1.1 схема

Подэлемент schema применяется ко всем сущностям, таблицам, вторичным столы, соединительные столы, коллекция таблицы, генераторы таблиц и генераторы последовательности в единице сохраняемости.

Подэлемент schema переопределен любым schema подэлементом entity-mappings элемент; любой schema элемент явно указан в Table или SecondaryTable аннотация на объекте или любом атрибуте schema на любой table или secondary-table подэлемент, определенный в пределах entity элемент; любой schema элемент явно указано в TableGenerator аннотация или table-generator субэлемент; любой элемент схемы, явно указанный в SequenceGenerator аннотация или sequence-generator субэлемент; любой schema элемент явно указан в аннотации JoinTable или join-table субэлемент; и любой элемент схемы, явно указанный в CollectionTable аннотация или collection-table субэлемент.

Из спецификации JPA 1.0:

10.1.1.1 схема

Подэлемент schema применяется ко всем лица, генераторы таблиц и соединение таблицы в единице сохраняемости.

Подэлемент schema переопределен любым schema подэлементом entity-mappings элемент; любой schema элемент явно указан в Table или SecondaryTable аннотация на объект или любую схему атрибут на любой table или secondary-table субэлемент определен в элементе entity; любой schema элемент явно указан в аннотации TableGenerator или table-generator субэлемент; и любой schema элемент явно указан в аннотации JoinTable или join-table субэлемент.

Итак, если ваш провайдер не предлагает некоторые конкретные расширения, мои предложения:

  • Обновите JPA 2.0, если это возможно, и с помощью подэлемента schema добьетесь цели ~ или ~
  • Используйте TableGenerator, если вам нужно придерживаться JPA 1.0 ~ или ~
  • Используйте псевдоним, если это возможно (я не знаю).

Ссылки

  • JPA 1.0 Технические характеристики
    • Раздел 9.1.37 «Аннотация SequenceGenerator»
    • Раздел 10.1.1.1 "Схема"
    • Раздел 12.2.2.5 «Генератор последовательности»
  • JPA 2.0 Спецификация
    • Раздел 11.1.44 «Аннотация SequenceGenerator»
    • Раздел 12.2.1.1 "Схема"
    • Раздел 12.2.2.5 «Генератор последовательности»
0 голосов
/ 15 октября 2010

Простите за вопрос очевидного, но вы предоставили право выбора последовательностей пользователю, который пытается выбрать из них, верно?

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