Как создать свойство для определения другого имени схемы с универсальным префиксом? - PullRequest
1 голос
/ 17 февраля 2020

Проблема в том, что у меня много nativeQueries, в которых я использую префикс имени схемы для определения таблицы, которую я хочу использовать.

Например:

SELECT * FROM SCHEMA.USERS u WHERE u.id = 100;

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

DB1: SCHEMA_1.USERS
DB2: SCHEMA_2.USERS

Можно ли создать свойство для спящего режима, где я могу определить, что SCHEMA_1 и SCHEMA_2 будут называться SCHEMA ? Как я проверял, Oracle SYNONYM не работает для схем ..

Ответы [ 2 ]

0 голосов
/ 17 февраля 2020

Я не из Hibernate, поэтому я не знаю, есть ли какой-нибудь нативный способ сделать это в самом Hibernate. В чистом методе Oracle при подключении к базе данных получите имя текущей схемы и назначьте его переменной, а затем используйте его в операторе SQL.

select sys_context( 'userenv', 'current_schema' ) as SCHEMA from dual;

Приведенный выше вывод, который можно назначить переменной SCHEMA в коде приложения Hibernate (опять же, я не уверен, что такое метод использования переменной в Hibernate, поэтому предположим, что пока $):

SELECT * FROM $SCHEMA.USERS u WHERE u.id = 100;

Итак, когда вы подключитесь к DB1, вы получите имя схемы, скажем, SCHEMA_1, а затем из DB2 вы получите SCHEMA_2. Но эти значения будут присвоены переменной $SCHEMA, поэтому вам не нужно беспокоиться об ее изменении, поскольку она будет динамически принимать имя схемы.

0 голосов
/ 17 февраля 2020

В соответствии с документацией hibernate

При использовании нескольких каталогов и схем баз данных Hibernate предлагает возможность настройки глобального каталога или схемы, чтобы вам не приходилось объявите это явно для каждой сущности.

<property name="hibernate.default_catalog" value="crm"/>
<property name="hibernate.default_schema" value="analytics"/>

и далее:

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

{h-catalog} - разрешает текущее значение свойства конфигурации hibernate.default_catalog.

{h-schema } - разрешает текущее значение свойства конфигурации hibernate.default_schema.

{h-domain} - разрешает текущие значения свойств конфигурации hibernate.default_catalog и hibernate.default_schema (например, catalog.schema).

Таким образом, вы можете избежать явного упоминания имени схемы в вашем родном sql:

SELECT * FROM {h-schema}USERS u WHERE u.id = 100;

Но что касается вашего вопроса:

Возможно ли создать свойство для hibernate, где я могу определить, что SCHEMA_1 и SCHEMA_2 будут известны как SCHEMA?

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

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