从会话工厂以编程方式获取休眠默认模式名称?

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")

【讨论】:

以上是关于从会话工厂以编程方式获取休眠默认模式名称?的主要内容,如果未能解决你的问题,请参考以下文章

Android以编程方式从联系人获取设备默认电话号码

如何在运行时更改 Hibernate 的 SessionFactory 的默认架构设置?

如何在 Spring 中以编程方式获取当前的活动/默认环境配置文件?

如何在 Spring 中以编程方式获取当前的活动/默认环境配置文件?

如何以编程方式从 Python 中的融合模式注册表中获取模式

在 Spring Boot 中使用默认模式以编程方式配置 OracleDataSource