Мне было интересно, есть ли способ получить имя схемы по умолчанию из сеанса factory, каким-то образом? Причина, по которой мне нужно это получить, - это то, что я должен использовать один собственный SQL, и у меня есть несколько сессионных фабрик для нескольких схем и одного источника данных. Все сгенерированные запросы на спящий режим запускаются одним пользователем, который имеет доступ к другим схемам.
Получение имени схемы спящего режима по умолчанию с сеанса factory?
Ответ 1
Я только узнал, что в спящем режиме есть замена {h-schema}, которая может использоваться в собственных SQL-запросах. Таким образом, это делает работу чисто, когда вы подключены к одной схеме в базе данных оракула и хотите выполнять запросы по различным схемам. Пример:
select * from {h-schema}table_name
Эти способы вместо выполнения ручного replaceAll
в запросе, hibernate позаботится обо всем, учитывая, что каждый сеанс factory настроен с свойством "hibernate.default_schema"
.
Ответ 2
У меня возникли проблемы с решением Джона использовать {h-schema} при использовании критерия api Restrictions.sqlRestriction(...) (вероятно, потому, что эта замена происходит в пределах отдельного HQL api). Подобно решению Майкла, я использовал:
SessionFactoryImplementor sfi = (SessionFactoryImplementor)sessionFactory;
String name = sfi.getSettings().getDefaultSchemaName();
Ответ 3
Это сделает трюк:
SessionFactoryImplementor sfi = (SessionFactoryImplementor) getSessionFactory();
Settings settings = sfi.getSettings();
ConnectionProvider connectionProvider = settings.getConnectionProvider();
try {
Connection connection = connectionProvider.getConnection();
DatabaseMetaData databaseMetaData = connection.getMetaData();
String url = databaseMetaData.getURL();
//substring the string to what you want
System.out.println(url);
} catch (SQLException e) {
//throw something
}