我想知道是否有办法从会话工厂获取默认模式名称,不知何故?我需要得到它的原因是因为我必须使用一个本机SQL,并且我有多个会话工厂用于多个模式和单个数据源。所有生成的hibernate查询都由一个用户运行,该用户可以选择访问其他模式。
答案 0 :(得分:18)
我刚刚发现hibernate有{h-schema}替换,可以在本机sql查询中使用。因此,当您连接到oracle数据库中的一个模式并希望针对不同模式执行查询时,这可以干净地完成工作。例如:
select * from {h-schema}table_name
这种方式不是在查询中执行手动replaceAll
,而是在每个会话工厂配置了"hibernate.default_schema"
属性的情况下,hibernate会处理所有事情。
答案 1 :(得分:4)
在使用Criteria api的Restrictions.sqlRestriction(...)时,我遇到John使用{h-schema}的解决方案的问题(可能是因为这种替换发生在单独的HQL api中)。与Michael的解决方案类似,我使用了:
SessionFactoryImplementor sfi = (SessionFactoryImplementor)sessionFactory;
String name = sfi.getSettings().getDefaultSchemaName();
答案 2 :(得分:1)
这样可以解决问题:
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
}
答案 3 :(得分:0)
@Ryan Morlok,由于声誉欠佳,我无法对您的回答发表评论。您的答案是正确的,但现在已弃用。在休眠版本5.0.1中,可以使用来获取架构名称
(SessionFactoryImpl)sessionFactory).getProperties().getProperty("hibernate.default_schema")