Как настроить схему базы данных по умолчанию для собственных запросов в чистом JPA?

Наша ситуация выглядит следующим образом:

  • Мы используем (обязательно чистый) JPA для настойчивости в нашем корпоративном приложении.
  • Из соображений производительности мы используем ряд довольно сложных нативных запросов здесь и там.
  • При доступе к базе данных (Oracle 11g) мы используем пользователя базы данных APP_ACCESS который отличается от "владельца" таблиц (APP_OWNER). Это жесткое требование от администрации базы данных.
  • На данный момент имя схемы (APP_OWNER) жестко закодирован в нативных запросах, а-ля:

"SELECT * FROM " + DatabaseSchemaConstants.SCHEMA_NAME + ".LOCATION"

Излишне говорить, что мы не особенно рады этому жесткому кодированию, поскольку изменение имени пользователя "владельца" будет означать изменения в коде, что определенно не годится для обслуживания.

Вот мой вопрос:

Как мы можем настроить схему базы данных по умолчанию для собственных запросов в чистом JPA?

Это то, что я нашел до сих пор:

Как настроить имя схемы по умолчанию в конфигурации 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).

Еще один пост с похожим ответом:

JPA - EclipseLink - Как изменить схему по умолчанию

Еще один вопрос:

получить имя схемы Hibernate по умолчанию программно из фабрики сеансов?

Смотрите этот ответ, который предлагает использовать {h-schema}, Выглядит подходящим, но это специфично для Hibernate. Мы хотели бы остаться с "чистым JPA". Другая проблема заключается в том, что я не смог найти упоминаний о {h-schema} в документации Hibernate, поэтому мы не можем полагаться на эту функцию.

Есть ли стандартный способ JPA, чтобы установить схему базы данных по умолчанию для всего - JPA соблазняет и запросы, а также собственные запросы?

В качестве альтернативы это может быть решено, если мы сможем использовать некоторые "параметры" или "настройки", установленные где-то в конфигурации в наших собственных запросах.

2 ответа

Решение

Этот вопрос может быть старым, но ответ на тот случай, если вы все еще столкнетесь с этим. Вы могли бы использовать {h-schema} для собственных запросов SQL (проверено для Hibernate v4). Это определяется hibernate.default_schema свойство конфигурации.

Пример:

"SELECT * FROM {h-schema}LOCATION"

Ссылка: https://vladmihalcea.com/how-to-resolve-the-hibernate-global-database-schema-and-catalog-for-native-sql-queries/

Наконец, после нескольких внутренних обсуждений мы решили решить эту проблему на уровне базы данных. Конкретно, используя 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;
Другие вопросы по тегам