Получение имени схемы спящего режима по умолчанию с сеанса factory?

Мне было интересно, есть ли способ получить имя схемы по умолчанию из сеанса factory, каким-то образом? Причина, по которой мне нужно это получить, - это то, что я должен использовать один собственный SQL, и у меня есть несколько сессионных фабрик для нескольких схем и одного источника данных. Все сгенерированные запросы на спящий режим запускаются одним пользователем, который имеет доступ к другим схемам.

Ответ 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
  }