7

HSQLDBを使用する必要のある単体テストがいくつかありますが、それらのいくつかが実際に物理DBにヒットしていることはわかっています。テストにチェックを追加して、使用されているデータソースがライブDBではなくHSQLDB用であることを確認したいと思います。

Hibernateセッションオブジェクト(org.hibernate.classic.Session)から、データソースを確認するにはどうすればよいですか?

更新: セッションファクトリ()にもアクセスできますorg.hibernate.impl.SessionFactory

詳細: Hibernate 3.2

4

4 に答える 4

7

ラッパーやHibernate/Springなどの具体的な実装に関係なく、データソースではなくデータベースタイプをチェックできます(これが適切な場合があります)。

アイデアは、DatabaseMetaDataを使用し、タイプをチェックすることです(Hibernateが方言を検出するため)。

private boolean isTestDb(Session session) {
    return session.doReturningWork(new ReturningWork<Boolean>() {
        @Override
        public Boolean execute(Connection connection) throws SQLException {
            DatabaseMetaData metaData = connection.getMetaData();
            return metaData.getDatabaseProductName().startsWith("HSQL");
        }
    });
}

メソッドの本体は任意の方法で変更できることに注意してください(JDBC URLを確認し、ドライバー名を確認し、ほとんどすべてを確認します)。

編集:上記のアプローチは休止状態の3.5以降で機能しています。

Hibernateの以前のバージョン(例:3.2)の場合、さらに簡単になる可能性があります。

private boolean isTestDb(Session session) {
    Conection connection = session.connection();//deprecated method, which was dumped in hibernate 3.5+
    DatabaseMetaData metaData = connection.getMetaData();
    return metaData.getDatabaseProductName().startsWith("HSQL");
}
于 2013-03-15T21:12:40.580 に答える
3

のサブクラスの場合AbstractTransactionalDataSourceSpringContextTests、試してみました getJdbcTemplate().getDataSource()か?

そうでなければあなたは試すことができます

((SessionImplementor) session).getJdbcConnectionAccess().obtainConnection()
       .getMetaData().getDatabaseProductName()

しかし、それは一種の嫌なことです。:)そしてHibernate4.xで導入されたようです。

編集:

古いバージョンでは、現在非推奨になっているものを使用してください。

    ((SessionImpl) session).getSessionFactory().getConnectionProvider()
                           .getConnection().getMetaData().getDatabaseProductName();
于 2013-03-15T20:46:53.370 に答える
1

これは完全なハックであり、セットアップで使用されていない可能性のある特定のクラスにキャストする必要があるため、機能しない可能性があります。

SessionFactoryImpl factory = (SessionFactoryImpl) session.getSessionFactory(); // or directly cast the sessionFactory
DatasourceConnectionProviderImpl provider = (DatasourceConnectionProviderImpl)factory.getConnectionProvider();
DataSource dataSource = provider.getDataSource();

factory.getConnectionProvider()任意の数のクラスConnectionProviderで実装できる(インターフェイス)インスタンスを返します。これらの1つは、データソースを取得するために使用できるです。DatasourceConnectionProviderImpl

DatasourceConnectionProviderImplHibernate C3P0またはProxoolプールを使用している場合を除き、デフォルトにする必要があります。

于 2013-03-15T21:06:22.737 に答える
0

新しい接続を開かずにdbプロバイダーを検出したい場合は、方言クラスを使用すると便利な場合があります。

    String dialectName = ((SessionFactoryImplementor)sessionFactory).getDialect().getClass().getSimpleName().toLowerCase();
    if(dialectName.contains("oracle"))
        ...
    else if(dialectName.contains("mysql"))
        ...
于 2015-11-25T13:12:17.143 に答える