从会话工厂以编程方式获取休眠默认模式名称?
Posted
技术标签:
【中文标题】从会话工厂以编程方式获取休眠默认模式名称?【英文标题】:getting hibernate default schema name programmatically from session factory? 【发布时间】:2011-06-17 11:36:01 【问题描述】:我想知道是否有办法从会话工厂获取默认模式名称,不知何故?我需要得到它的原因是因为我必须使用一个本机 SQL,并且我有多个会话工厂用于多个模式和一个数据源。所有生成的休眠查询都由单个用户运行,该用户具有对其他模式的选择访问权限。
【问题讨论】:
【参考方案1】:我刚刚发现 hibernate 有 h-schema 替换,可以在本地 sql 查询中使用。因此,当您连接到 oracle 数据库中的一个模式并想要针对不同的模式执行查询时,这可以干净地完成工作。例如:
select * from h-schematable_name
这种方式不是在查询中手动执行replaceAll
,而是在每个会话工厂都配置有"hibernate.default_schema"
属性的情况下,hibernate 会处理所有事情。
【讨论】:
我在使用 Restrictions.sqlRestriction(...) 时遇到了问题【参考方案2】:在使用 Criteria api 的 Restrictions.sqlRestriction(...) 时,John 使用 h-schema 的解决方案有问题(可能是因为这种替换发生在单独的 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
【讨论】:
在我的系统上,这确实回复了连接 url...而不是架构。【参考方案4】:@Ryan Morlok,由于缺乏声誉,我无法评论您的回答。您的答案是正确的,但现在已弃用。在休眠版本 5.0.1 中,可以使用模式名称获取
(SessionFactoryImpl)sessionFactory).getProperties().getProperty("hibernate.default_schema")
【讨论】:
以上是关于从会话工厂以编程方式获取休眠默认模式名称?的主要内容,如果未能解决你的问题,请参考以下文章
如何在运行时更改 Hibernate 的 SessionFactory 的默认架构设置?
如何在 Spring 中以编程方式获取当前的活动/默认环境配置文件?
如何在 Spring 中以编程方式获取当前的活动/默认环境配置文件?