Получить имя схемы 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")