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

时间:2011-01-28 20:09:33

标签: hibernate sessionfactory

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

4 个答案:

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