2011-01-28 11 views
10

セッションファクトリからデフォルトのスキーマ名を取得する方法があるのか​​どうか疑問に思っていました。なぜなら、1つのネイティブSQLを使用する必要があり、複数のスキーマと1つのデータソースに対して複数のセッションファクトリがあるからです。生成されたすべてのハイバネートクエリは、他のスキーマへの選択アクセス権を持つ単一のユーザーによって実行されています。これは、トリックを行いますセッションファクトリからプログラムでHibernateのデフォルトスキーマ名を取得していますか?

答えて

15

私はHibernateはネイティブSQLクエリで使用することができる{H-スキーマ}交換を有することを見出しました。したがって、oracleデータベースの1つのスキーマに接続していて、異なるスキーマに対して問合せを実行する場合は、この処理が正常に行われます。例のようになります。

select * from {h-schema}table_name 

この方法の代わりに、クエリで手動replaceAllをやって、休止状態は、各セッションの工場は"hibernate.default_schema"プロパティで設定されていることを与えられたすべての世話をします。

+0

Restrictions.sqlRestriction(...)を使用するときに問題が発生しました –

+0

これは機能しますが、正式に文書化されていますか? –

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

3

Criteria APIのRestrictions.sqlRestriction(...)を使用するときに、{h-schema}を使用するというJohnの解決策に問題がありました(おそらく、この置換は別のHQL API内で行われるためです)。 Michaelのソリューションと同様に、私は次のように使用しました。

SessionFactoryImplementor sfi = (SessionFactoryImplementor)sessionFactory; 
String name = sfi.getSettings().getDefaultSchemaName(); 
関連する問題