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

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

3 ответа

Решение

Я только что узнал, что в hibernate есть замена {h-schema}, которую можно использовать в нативных SQL-запросах. Так что это делает работу чисто, когда вы подключены к одной схеме в базе данных oracle и хотите выполнять запросы к разным схемам. Примером будет:

select * from {h-schema}table_name

Это способы вместо того, чтобы делать руководство replaceAll в запросе hibernate позаботится обо всем, учитывая, что каждая фабрика сеанса настроена с "hibernate.default_schema" имущество.

У меня были проблемы с решением Джона использовать {h-schema} при использовании Restrictions.sqlRestriction(...) API-интерфейса Criteria (возможно, потому что эта замена происходит внутри отдельного API-интерфейса HQL). По аналогии с решением Майкла я использовал:

SessionFactoryImplementor sfi = (SessionFactoryImplementor)sessionFactory;
String name = sfi.getSettings().getDefaultSchemaName();

Это сделает свое дело:

  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
  }

@ Райан Морлок, я не могу прокомментировать ваш ответ из-за отсутствия репутации. Ваш ответ правильный, но сейчас он устарел. В hibernate версии 5.0.1 имя схемы можно получить с помощью

(SessionFactoryImpl)sessionFactory).getProperties().getProperty("hibernate.default_schema")
Другие вопросы по тегам