Hibernate 4未设置’hibernate.dialect’时,对DialectResolutionInfo的访问不能为空

我正在使用Hibernate最新版本4.3.5.Final

我的hibernate.cfg.xml文件内容:

     com.mysql.jdbc.Driver jdbc:mysql://localhost/Test pankaj xxxx org.hibernate.dialect.MySQLDialect    

用于创建SessionFactory的实用程序类:

 package com.example; import org.hibernate.SessionFactory; import org.hibernate.boot.registry.StandardServiceRegistryBuilder; import org.hibernate.cfg.Configuration; public class HibernateUtil { private static final SessionFactory sessionFactory = buildSessionFactory(); private static SessionFactory buildSessionFactory() { try { // Create the SessionFactory from hibernate.cfg.xml Configuration configuration = new Configuration(); configuration.configure("hibernate.cfg.xml"); System.out.println("Hibernate Configuration loaded"); SessionFactory sessionFactory = configuration.buildSessionFactory(new StandardServiceRegistryBuilder().build()); return sessionFactory; } catch (Throwable ex) { // Make sure you log the exception, as it might be swallowed System.err.println("Initial SessionFactory creation failed." + ex); throw new ExceptionInInitializerError(ex); } } public static SessionFactory getSessionFactory() { return sessionFactory; } } 

当我在main()方法中使用它时,我得到以下exception:

 May 04, 2014 11:55:56 PM org.hibernate.cfg.Configuration doConfigure INFO: HHH000041: Configured SessionFactory: null Hibernate Configuration loaded May 04, 2014 11:55:57 PM org.hibernate.engine.jdbc.connections.internal.ConnectionProviderInitiator initiateService WARN: HHH000181: No appropriate connection provider encountered, assuming application will be supplying connections Initial SessionFactory creation failed.org.hibernate.HibernateException: Access to DialectResolutionInfo cannot be null when 'hibernate.dialect' not set Exception in thread "main" java.lang.ExceptionInInitializerError at com.example.HibernateUtil.buildSessionFactory(HibernateUtil.java:25) at com.example.HibernateUtil.(HibernateUtil.java:9) at com.example.HibernateMain.main(HibernateMain.java:26) Caused by: org.hibernate.HibernateException: Access to DialectResolutionInfo cannot be null when 'hibernate.dialect' not set at org.hibernate.engine.jdbc.dialect.internal.DialectFactoryImpl.determineDialect(DialectFactoryImpl.java:104) at org.hibernate.engine.jdbc.dialect.internal.DialectFactoryImpl.buildDialect(DialectFactoryImpl.java:71) at org.hibernate.engine.jdbc.internal.JdbcServicesImpl.configure(JdbcServicesImpl.java:209) at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.configureService(StandardServiceRegistryImpl.java:111) at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:234) at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:206) at org.hibernate.cfg.Configuration.buildTypeRegistrations(Configuration.java:1885) at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1843) at com.example.HibernateUtil.buildSessionFactory(HibernateUtil.java:18) ... 2 more 

我已经尝试了很多选项,并寻找在线资源,hibernate文档,但无法找到这里缺少的东西。 任何帮助表示赞赏。

最后能够解决问题,问题在于SessionFactory的创建方式。

对于首发,官方文档是第一个去的地方,我必须说Hibernate官方文档似乎没有更新最新的版本更改。

修复是将配置设置应用于StandardServiceRegistryBuilder实例。

 // Create the SessionFactory from hibernate.cfg.xml Configuration configuration = new Configuration(); configuration.configure("hibernate.cfg.xml"); ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder() .applySettings(configuration.getProperties()).build(); SessionFactory sessionFactory = configuration .buildSessionFactory(serviceRegistry); 

有关更多详细信息,请参阅我的博客文章。

我曾经遇到过完全相同的问题,事实certificate问题是我没有在本地启动数据库服务(我发现你也在使用本地数据库)。 那简单!!!

删除设置方言的两行,Hibernate 4根据您提供的JDBC驱动程序以及它连接的数据库,确定要使用哪种方言。 您不需要指定方言。 如果你强制使用一个不正确或与驱动程序不匹配的方言(这可能会发生,因为方言比JDBC驱动程序更频繁地更新)Hibernate可能无法按预期执行。

使用hibernate.cfg.xml配置Hibernate是使用Hibernate时的工作方式3. Hibernate 4支持Spring Application上下文中的XML配置。 (我假设你正在使用Spring)它非常顺利地挂钩。 我建议您切换到使用配置Hibernate的新方法,因为您为Hibernate 3设置了配置文档类型。

这是您希望使用Spring应用程序上下文为Hibernate 4指定dataSource的方式。

       

然后你将它连接到会话工厂,如下所示:

        true validate       

运行mysql服务时出现同样的问题,正确的凭据,但数据库名称拼写错误,所以基本上数据库不存在。

使用以下内容时遇到此问题:

  • Spring框架/数据:4.1.6;
  • Spring Boot:1.2.3;
  • JPA的Hibernate提供程序:4.3.8。

我在数据库端启用了SSL作为基于主机的身份validation机制的一部分(使用Postgres),问题是我没有在启动时指定与包含客户端应用程序证书的密钥库相关的SSL JVM属性。应用:

-Djavax.net.ssl.keyStore = mykeystore.jks -Djavax.net.ssl.keyStorePassword = myPassword

注意:我理解答案已经得到解答,但我将留下这个答案以备将来参考。

这没关系

 Configuration cfg = new Configuration().configure(); StandardServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder() .applySettings(cfg.getProperties()).build(); SessionFactory sf = cfg.buildSessionFactory(serviceRegistry); Session session = sf.openSession(); 

从这里的hibernate源代码,StandardServiceRegistryBuilder实例用于从hibernate.cfg.xml获取不同的服务,例如serviceRegistry.getService( JdbcServices.class )serviceRegistry.getService( CacheImplementor.class )

旧的configuration.buildSessionFactory()方法现在如下:

 public SessionFactory buildSessionFactory() throws HibernateException { Environment.verifyProperties( properties ); ConfigurationHelper.resolvePlaceHolders( properties ); final ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder() .applySettings( properties ) .build(); setSessionFactoryObserver( new SessionFactoryObserver() { @Override public void sessionFactoryCreated(SessionFactory factory) { } @Override public void sessionFactoryClosed(SessionFactory factory) { ( (StandardServiceRegistryImpl) serviceRegistry ).destroy(); } } ); return buildSessionFactory( serviceRegistry ); } 

您也可以通过这种方式创建sesisonFactory来解决问题。

 SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory( new StandardServiceRegistryBuilder().applySettings(new Configuration().configure().getProperties()).build()); 

在我的情况下,我运行配置例程两次。 我在一个方法中进行了自动配置(即从资源中的xml配置),然后通过在另一种方法中设置属性来实现配置,但我忘了绕过前者。 我一做到,错误消失了。

我有完全相同的问题,问题是,我的计算机没有输入postgres数据库的pg_hba.conf,允许允许哪些客户端(IP-Adresses)与数据库通话

在我将连接字符串从远程地址更改为localhost后,我使用了错误的用户名和密码。 希望这会有所帮助。

 // Create Configuration File and configure it. Configuration configuration=new Configuration(); configuration.configure("com/sathya/config/emp.cfg.xml"); // Create Service Registry ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()).build(); // Create Session Object using SessionFactory Interface SessionFactory sessionFactory = configuration.buildSessionFactory(serviceRegistry); Session session=sessionFactory.openSession(); // new StandardServiceRegistryBuilder().applySettings(new Configuration().getProperties()); // Session session=new Configuration().buildSessionFactory(new StandardServiceRegistryBuilder().build()).openSession();