Java 如何确定Hibernate会话正在使用的数据源?

Java 如何确定Hibernate会话正在使用的数据源?,java,hibernate,junit,hsqldb,Java,Hibernate,Junit,Hsqldb,我有几个单元测试应该使用HSQLDB,但我知道其中一些测试实际上是在使用物理DB。我想在测试中添加一个检查,以确保所使用的数据源用于HSQLDB而不是live DB 从hibernate会话对象(org.hibernate.classic.session)中,如何检查数据源 更新: 我还可以访问会话工厂(org.hibernate.impl.SessionFactory) 详细信息:Hibernate 3.2如果它是AbstractTransactionalDataSourceSpringCon

我有几个单元测试应该使用HSQLDB,但我知道其中一些测试实际上是在使用物理DB。我想在测试中添加一个检查,以确保所使用的数据源用于HSQLDB而不是live DB

从hibernate会话对象(
org.hibernate.classic.session
)中,如何检查数据源

更新: 我还可以访问会话工厂(
org.hibernate.impl.SessionFactory


详细信息:Hibernate 3.2

如果它是
AbstractTransactionalDataSourceSpringContextTests
的子类,那么您尝试过吗
getJdbcTemplate().getDataSource()

否则你可以试试

((SessionImplementor) session).getJdbcConnectionAccess().obtainConnection()
       .getMetaData().getDatabaseProductName()
但这有点恶心。:)并且似乎在Hibernate4.x中引入

编辑: 在旧版本上,请使用现在已弃用的:

    ((SessionImpl) session).getSessionFactory().getConnectionProvider()
                           .getConnection().getMetaData().getDatabaseProductName();

这完全是一种黑客行为,可能不起作用,因为您需要强制转换到安装程序可能不使用的特定类

SessionFactoryImpl factory = (SessionFactoryImpl) session.getSessionFactory(); // or directly cast the sessionFactory
DatasourceConnectionProviderImpl provider = (DatasourceConnectionProviderImpl)factory.getConnectionProvider();
DataSource dataSource = provider.getDataSource();
factory.getConnectionProvider()
返回可以实现的
ConnectionProvider
(接口)实例。其中之一是
DatasourceConnectionProviderImpl
,您可以使用它来获取数据源


除非您使用的是hibernate C3P0或Proxool池,否则DatasourceConnectionProviderImpl应为默认值。

无论hibernate/Spring的包装器和具体实现如何,您都可以选择数据库类型,而不是数据源

其思想在于使用并对照它检查类型(正如Hibernate检测方言):


如果您想在不打开新连接的情况下检测db提供程序,您可能会发现使用方言类很有用

    String dialectName = ((SessionFactoryImplementor)sessionFactory).getDialect().getClass().getSimpleName().toLowerCase();
    if(dialectName.contains("oracle"))
        ...
    else if(dialectName.contains("mysql"))
        ...

测试周围有很多内部专有的包装。它是对
org.springframework.test.AbstractTransactionalDataSourcesspringContextTests
getJdbcTemplate()返回nullgetJdbcConnectionAccess()的扩展,在SessionImplementor(
org.hibernate.engine.SessionImplementor
)上似乎不是一个很好的方法,然而,我使用的是Hibernate3.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");
}
    String dialectName = ((SessionFactoryImplementor)sessionFactory).getDialect().getClass().getSimpleName().toLowerCase();
    if(dialectName.contains("oracle"))
        ...
    else if(dialectName.contains("mysql"))
        ...