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

时间:2010-12-04 01:37:39

标签: java hibernate

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

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

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

提前致谢,

10 个答案:

答案 0 :(得分:9)

我认为你可以这样做:

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

答案 1 :(得分:8)

非常感谢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

答案 2 :(得分:4)

sessionFactory.getDialect();

为您提供Dialect

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

为您提供连接网址。

注意:这仅适用于SessionFactoryImpl类,而不适用于界面

答案 3 :(得分:3)

或者您可以尝试:

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];

答案 4 :(得分:3)

最简单的方法是获取当前配置的属性,然后使用键“ hibernate.connection.url”获取您的数据库URL。以下代码显示当前会话的URL

System.out.println(sessionFactory.getProperties().get("hibernate.connection.url"))

在我的系统上,我得到

jdbc:postgresql://localhost:15432/tempdb

答案 5 :(得分:1)

由于你有hibernate.properties或hibernate.cfg.xml,你可以一直读取这些文件中的任何信息。

答案 6 :(得分:1)

你可以试试这段代码:

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];

答案 7 :(得分:0)

对于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();

答案 8 :(得分:0)

您可以在 IntelliJ 中的变量视图中检查它,如下所示

Screenshot

答案 9 :(得分:0)

这对我有用:

DataSource dataSource = (DataSource)entityManagerFactory.getProperties()
.get("hibernate.connection.datasource");

Connection connection = dataSource.getConnection();
String databaseName = connection.getCatalog();