По соображениям безопасности наши объекты 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 для последовательностей в схеме пользователя.
- прекратить использование последовательностей и использовать другой способ генерации идентификаторов.