16

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

4

4 に答える 4

26

hibernateには、ネイティブSQLクエリで使用できる{h-schema}置換があることがわかりました。したがって、Oracleデータベース内の1つのスキーマに接続していて、別のスキーマに対してクエリを実行する場合、これは問題なく機能します。例は次のとおりです。

select * from {h-schema}table_name

この方法では、クエリで手動を実行する代わりに、replaceAll各セッションファクトリがプロパティで構成されている場合、hibernateがすべてを処理し"hibernate.default_schema"ます。

于 2011-01-31T13:10:27.193 に答える
7

Criteria apiのRestrictions.sqlRestriction(...)を使用するときに{h-schema}を使用するJohnのソリューションに問題がありました(おそらく、この置換は別のHQL api内で発生するためです)。Michaelのソリューションと同様に、私は以下を使用しました。

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、評判が悪いのであなたの答えにコメントすることはできません。あなたの答えは正しいですが、現在は非推奨です。hibernateバージョン5.0.1では、スキーマ名は次を使用して取得できます

(SessionFactoryImpl)sessionFactory).getProperties().getProperty("hibernate.default_schema")
于 2019-02-22T21:32:36.613 に答える