2011-01-28 76 views
10

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

回答

15

我刚刚发现,Hibernate有{H-模式}更换,可以在原生SQL查询中使用。因此,当您连接到Oracle数据库中的一个模式并希望针对不同模式执行查询时,它可以干净地完成这项工作。例子是:

select * from {h-schema}table_name 

这种方式,而不是在一个查询做手工replaceAll,Hibernate会考虑到每个会话工厂配置了"hibernate.default_schema"财产打理一切。

+0

我在使用Restrictions.sqlRestriction(...)时遇到了问题(...) – 2011-12-14 06:26:36

2

这将这样的伎俩:

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 
    } 
+0

在我的系统上,这不会回应连接url ...不是架构。 – Markus 2016-06-03 16:27:22

3

当使用Criteria API的Restrictions.sqlRestriction(...)(可能是因为这种替换发生在单独的HQL API中)时,John的解决方案出现了使用{h-schema}的问题。类似迈克尔的解决方案,我用:

SessionFactoryImplementor sfi = (SessionFactoryImplementor)sessionFactory; 
String name = sfi.getSettings().getDefaultSchemaName();