我想知道是否有办法从会话工厂获取默认模式名称,不知何故?我需要得到它的原因是因为我必须使用一个本机 SQL,并且我有多个会话工厂用于多个模式和单个数据源。所有生成的休眠查询都由单个用户运行,该用户具有对其他模式的选择访问权限。
问问题
21445 次
4 回答
26
我刚刚发现 hibernate 有 {h-schema} 替换,可以在本机 sql 查询中使用。因此,当您连接到 oracle 数据库中的一个模式并想要针对不同的模式执行查询时,这可以干净地完成工作。示例是:
select * from {h-schema}table_name
这种方式不是在查询中进行手动操作,而是在每个会话工厂都配置了属性replaceAll
的情况下,hibernate 将处理所有事情。"hibernate.default_schema"
于 2011-01-31T13:10:27.193 回答
7
在使用 Criteria api 的 Restrictions.sqlRestriction(...) 时,John 使用 {h-schema} 的解决方案有问题(可能是因为这种替换发生在单独的 HQL api 中)。与迈克尔的解决方案类似,我使用了:
SessionFactoryImplementor sfi = (SessionFactoryImplementor)sessionFactory;
String name = sfi.getSettings().getDefaultSchemaName();
于 2011-12-14T06:28:58.293 回答
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
}
于 2011-01-29T10:30:00.127 回答
0
@Ryan Morlok,由于缺乏声誉,我无法评论您的回答。您的答案是正确的,但现在已弃用。在休眠版本 5.0.1 中,可以使用模式名称
(SessionFactoryImpl)sessionFactory).getProperties().getProperty("hibernate.default_schema")
于 2019-02-22T21:32:36.613 回答