如何从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();
- Hibernate 3.6.10不会通过OneToMany JoinTable级联删除
- @MappedSuperclass不是@entity?
- Hibernate可以返回除List之外的结果对象的集合吗?
- 为什么Hibernate 4.2使用jandex和classmate,如果它的Maven POM将它们定义为测试范围?
- 如何配置maven hbm2hbmxml和hbm2java在mvn clean install中依次运行
- 使用数据库现有表创建实体类?
- Hibernate可以用于性能敏感的应用程序吗?
- 在运行时将Hibernate实体绑定到表
- javax.persistence.PersistenceException:未找到类或包