Java 如何确定Hibernate会话正在使用的数据源?
我有几个单元测试应该使用HSQLDB,但我知道其中一些测试实际上是在使用物理DB。我想在测试中添加一个检查,以确保所使用的数据源用于HSQLDB而不是live DB 从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
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"))
...