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

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

Например:

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 не работает для схем.


person Dawid    schedule 17.02.2020    source источник


Ответы (2)


Согласно документации 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;

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

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

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

person SternK    schedule 17.02.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, поэтому вам не нужно беспокоиться об ее изменении, поскольку она будет динамически принимать имя схемы.

person Lalit Kumar B    schedule 17.02.2020