16

我想知道是否有办法从会话工厂获取默认模式名称,不知何故?我需要得到它的原因是因为我必须使用一个本机 SQL,并且我有多个会话工厂用于多个模式和单个数据源。所有生成的休眠查询都由单个用户运行,该用户具有对其他模式的选择访问权限。

4

4 回答 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 回答