如何从hibernate提供程序知道底层数据库名称

我正在使用hibernate 3.x和Jboss。 目前我们支持多个数据库。

现在在运行时,我如何知道底层数据库信息? 至少名称或数据库方言? (例如MySQL,Derby,Oracle等)?

任何人都可以建议任何方式来查找这些信息吗? 我以为hibernate SessionFactory类会提供这样的api – 但它不是吗?

提前致谢,

我想你可以这样做:

sessionFactory.getCurrentSession().connection().getMetaData().getURL() 

非常感谢javamonkey79和costis回答这个问题。

是的 – 我可以阅读hibernate.properties/cfg.xml文件 – 但我想避免文件阅读工作流程。

看来Session::connection() api现在已被弃用,但它仍然有效。 我们还可以通过下面列出的其他方式检索相同的信息。

选项1

 Session session = sessionFactory.openSession(); String dbURL = session.connection().getMetaData().getURL().toString(); session.close(); 

方案2

 Settings settings = ((SessionFactoryImpl) sessionFactory).getSettings(); if (settings != null) { Connection connection = settings.getConnectionProvider().getConnection(); String dbURL = connection.getMetaData().getURL(); connection.close(); } 

对于MySql,返回URL的格式为:

 jdbc:mysql://localhost:3306/edm?useUnicode=true 
 sessionFactory.getDialect(); 

给你Dialect

 sessionFactory.getSettings().getConnectionProvider().getConnection().getMetaData().getURL(); 

为您提供连接URL。

注意 :这仅适用于SessionFactoryImpl类,而不适用于接口

或者您可以尝试:

 SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory(); SessionFactoryImpl sessionFactoryImpl = (SessionFactoryImpl) sessionFactory; Properties props = sessionFactoryImpl.getProperties(); String url = props.get("hibernate.connection.url").toString(); String[] urlArray = url.split(":"); String db_name = urlArray[urlArray.length - 1]; 

由于您有hibernate.properties或hibernate.cfg.xml,因此您可以始终读取这些文件中的任何信息。

你可以试试这段代码:

 String url = null; try { url = getSession().connection().getMetaData().getURL().toString(); } catch (HibernateException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } String[] urlArray = url.split(":"); String db_name = urlArray[1]; 

;)

对于Hibernate 5.2.0,获取数据源..

 SessionFactoryImplementor entityManagerFactory = (SessionFactoryImplementor) sessionFactory.openSession().getEntityManagerFactory(); DatasourceConnectionProviderImpl connectionProvider = (DatasourceConnectionProviderImpl) entityManagerFactory.getServiceRegistry().getService(ConnectionProvider.class); BasicDataSource dataSource = (BasicDataSource) connectionProvider.getDataSource(); dataSource.getUrl();