Как настроить схему базы данных по умолчанию для собственных запросов в чистом JPA?
Наша ситуация выглядит следующим образом:
- Мы используем (обязательно чистый) JPA для настойчивости в нашем корпоративном приложении.
- Из соображений производительности мы используем ряд довольно сложных нативных запросов здесь и там.
- При доступе к базе данных (Oracle 11g) мы используем пользователя базы данных
APP_ACCESS
который отличается от "владельца" таблиц (APP_OWNER
). Это жесткое требование от администрации базы данных. - На данный момент имя схемы (
APP_OWNER
) жестко закодирован в нативных запросах, а-ля:
"SELECT * FROM " + DatabaseSchemaConstants.SCHEMA_NAME + ".LOCATION"
Излишне говорить, что мы не особенно рады этому жесткому кодированию, поскольку изменение имени пользователя "владельца" будет означать изменения в коде, что определенно не годится для обслуживания.
Вот мой вопрос:
Как мы можем настроить схему базы данных по умолчанию для собственных запросов в чистом JPA?
Это то, что я нашел до сих пор:
В частности, это ответ, который предлагает комбинацию персистентной единицы и orm.xml
файл:
<?xml version="1.0" encoding="UTF-8"?>
<entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm http://java.sun.com/xml/ns/persistence/orm_1_0.xsd"
version="1.0">
<persistence-unit-metadata>
<persistence-unit-defaults>
<schema>myschema</schema>
</persistence-unit-defaults>
</persistence-unit-metadata>
</entity-mappings>
Но я думаю, что это не относится к нативным запросам (мы сейчас тестируем это). Другая проблема заключается в том, что orm.xml
не совсем для конфигурации. (Но это все же лучше, чем жесткое кодирование в коде Java).
Еще один пост с похожим ответом:
Еще один вопрос:
получить имя схемы Hibernate по умолчанию программно из фабрики сеансов?
Смотрите этот ответ, который предлагает использовать {h-schema}
, Выглядит подходящим, но это специфично для Hibernate. Мы хотели бы остаться с "чистым JPA". Другая проблема заключается в том, что я не смог найти упоминаний о {h-schema} в документации Hibernate, поэтому мы не можем полагаться на эту функцию.
Есть ли стандартный способ JPA, чтобы установить схему базы данных по умолчанию для всего - JPA соблазняет и запросы, а также собственные запросы?
В качестве альтернативы это может быть решено, если мы сможем использовать некоторые "параметры" или "настройки", установленные где-то в конфигурации в наших собственных запросах.
2 ответа
Этот вопрос может быть старым, но ответ на тот случай, если вы все еще столкнетесь с этим. Вы могли бы использовать {h-schema}
для собственных запросов SQL (проверено для Hibernate v4). Это определяется hibernate.default_schema
свойство конфигурации.
Пример:
"SELECT * FROM {h-schema}LOCATION"
Наконец, после нескольких внутренних обсуждений мы решили решить эту проблему на уровне базы данных. Конкретно, используя after logon
спусковой крючок:
CREATE OR REPLACE TRIGGER db_logon AFTER logon ON DATABASE
WHEN
(
USER = 'APP_ACCESS'
)
BEGIN
EXECUTE immediate 'ALTER SESSION SET CURRENT_SCHEMA = APP_OWNER';
END;