HibernateException:当’hibernate.dialect’未设置时,对DialectResolutionInfo的访问不能为null

使用maven创建一个Hibernate测试项目。

当我运行项目时,它会生成exception:

org.hibernate.engine.jdbc.connections.internal.ConnectionProviderInitiator initiateService WARN: HHH000181: No appropriate connection provider encountered, assuming application will be supplying connections 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:89) at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:206) at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:178) at org.hibernate.cfg.Configuration.buildTypeRegistrations(Configuration.java:1885) at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1843) at org.hibernate.hibernatetest.App.main(App.java:33) Exception in thread "main" java.lang.NullPointerException at org.hibernate.hibernatetest.App.main(App.java:51) 

但是在主类中需要设置属性。不知道为什么程序是genrAatingexception。

主类:

 public class App { public static void main(String[] args) { Configuration configuration; ServiceRegistry serviceRegistry; SessionFactory sessionFactory; Session session = null; try { configuration = new Configuration(); serviceRegistry = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()).build(); configuration.setProperty("hibernate.dialect ", "com.applerao.hibernatesqlite.dialect.SQLiteDialect"); configuration.setProperty("hibernate.connection.url ", "jdbc:sqlite:TailorDB.db"); configuration.setProperty("hibernate.connection.driver_class ", "org.sqlite.JDBC"); configuration.setProperty("hibernate.connection.username ", ""); configuration.setProperty("hibernate.connection.password ", ""); sessionFactory = configuration.buildSessionFactory(serviceRegistry); session = sessionFactory.openSession(); CustomerModel c = new CustomerModel(); c.setID(5); c.setNIC_Number("691201631345"); c.setFirstName("Zee"); c.setNumber("55225522"); c.setLastName("Jan"); c.setCustomerCode("Zee-123"); session.beginTransaction(); session.save(c); session.getTransaction().commit(); } catch (HibernateException e) { e.printStackTrace(); } finally { session.close(); } } } 

在POM文件中:

   org.hibernate hibernate-core 4.3.0.Final   org.xerial sqlite-jdbc 3.7.2   com.applerao hibernatesqlite 1.0   

知道问题出在哪里?

CustomerModel cLass:

 @Entity @Table(name = "Customer") public class CustomerModel { @Id @GeneratedValue @Column(name = "c_id") int ID; @Column(name = "c_code") String customerCode; @Column(name = "c_fname") String firstName; @Column(name = "c_mname") String middleName; @Column(name = "c_lname") String lastName; @Column(name = "c_nic") String NIC_Number; @Column(name = "c_email") String email; @Column(name = "c_pnumber") String number; } 

您没有正确初始化configuration,serviceRegistry和sessionFactory。 从Hibernate 4.3.2.Final,引入了StandardServiceRegistryBuilder。 请按照此顺序进行初始化,例如

  Configuration configuration = new Configuration(); configuration.configure("com/jeecourse/config/hibernate.cfg.xml"); ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings( configuration.getProperties()).build(); sessionFactory = configuration.buildSessionFactory(serviceRegistry); 

所以在你的代码中,你错过了这个步骤: configuration.configure()

这似乎是一个老问题,但现在当我使用4.3.1最终的Hibernate版本时,我也遇到了这个问题。 阅读了许多答案后,似乎他们在文档中没有真正处理它,但我查看了文档,我认为他们有必要的信息。 hibernate配置不一定需要在.properties文件中,但它也可以在xml文件中。

只需确保在调用StandardServiceRegistryBuilder实例上的build()之前调用configure() 。 这是因为configure()实际上从默认的cfg.xml文件加载配置,而构建实际上使用它。

要理解这一点,你可以做一件事….在调用configure() ….调用getSettings()StandardServiceRegistryBuilder的intance并打印它…它是一个Map。

您将看不到cfg.xml中提到的任何hibernate属性

现在调用configure()并打印getSettings() map ….你会看到……你已经拥有了所有属性。

在hibernate 4.3中,似乎需要使用hibernate.properties来进行配置,只使用hibernate.cfg.xml来包含.hbm.xml文件,因此,以下是解决方案:

在classpath中,添加一个文件:hibernate.properties并在此处执行所有配置,例如:

 #jdbc connecition
 hibernate.connection.driver_class = org.postgresql.Driver
 hibernate.connection.url = jdbc:postgresql:// localhost:5432 / xdm
 hibernate.connection.username = postgres
 hibernate.connection.password = 123456

 #方言
 hibernate.dialect = org.hibernate.dialect.PostgreSQL82Dialect

 #c3p0
 hibernate.c3p0.min_size = 2
 hibernate.c3p0.max_size = 5
 hibernate.c3p0.max_statements = 20
 hibernate.jdbc.batch_size = 10
 hibernate.c3p0.timeout = 300
 hibernate.c3p0.idle_test_period = 3000
 hibernate.c3p0.testConnectionOnCheckout = true

 #other
 hibernate.show_sql = true
 hibernate.max_fetch_depth = 3

然后,在hibernate.cfg.xml中,只包含.hbm.xml文件,例如:

         

提示:官方文件没有给出任何这样的提示,我认为这是一件非常糟糕的事情。

在将配置属性应用于StandardServiceRegistryBuilder的设置之前设置配置属性

  configuration.setProperty("hibernate.dialect", "com.applerao.hibernatesqlite.dialect.SQLiteDialect"); configuration.setProperty("hibernate.connection.url", "jdbc:sqlite:TailorDB.db"); configuration.setProperty("hibernate.connection.driver_class", "org.sqlite.JDBC"); configuration.setProperty("hibernate.connection.username", ""); configuration.setProperty("hibernate.connection.password", ""); serviceRegistry = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()).build(); sessionFactory = configuration.buildSessionFactory(serviceRegistry); 

此外,在设置属性键时,似乎在属性键的末尾有一个空格。 请删除它们。

根据链接 ,尝试更改此链接

 configuration.setProperty("hibernate.dialect", "com.applerao.hibernatesqlite.dialect.SQLiteDialect"); 

 configuration.setProperty("dialect", "com.applerao.hibernatesqlite.dialect.SQLiteDialect"); 

谢谢你的解决方案。 不知怎的,4.3.5没有从hibernate.cfg.xml获取连接(Dialect)信息,为此使用hibernate.properties文件。

以下是我在没有hibernate.cfg.xmlhibernate.properties情况下在代码中进行所有配置所做的工作。 用hibernate版本4.3.8.Final测试。 希望它会有所帮助。

  Configuration configuration = new Configuration(); Properties properties = new Properties(); properties.put(Environment.DRIVER, com.mysql.jdbc.Driver.class.getName()); properties.put(Environment.USER, "root"); properties.put(Environment.PASS, "root"); properties.put(Environment.HBM2DDL_AUTO, "create"); properties.put(Environment.DIALECT, MySQL5Dialect.class.getName()); properties .put(Environment.URL, "jdbc:mysql://localhost/hibernate_test"); properties.put(Environment.SHOW_SQL, true); configuration.setProperties(properties); configuration.addAnnotatedClass(Stock.class).addAnnotatedClass( StockDailyRecord.class); ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder() .applySettings(configuration.getProperties()).build(); SessionFactory sessionFactory = configuration .buildSessionFactory(serviceRegistry); 

正如他所说的ServiceRegistry:

 package org.phenix.hibernate.main; import org.hibernate.SessionFactory; import org.hibernate.boot.registry.StandardServiceRegistryBuilder; import org.hibernate.cfg.Configuration; import org.hibernate.service.ServiceRegistry; public class HibernateUtil { private static final SessionFactory sessionFactory = buildSessionFactory(); private static SessionFactory buildSessionFactory() { try { Configuration configuration = new Configuration(); configuration.configure("hibernate.cfg.xml"); ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder() .applySettings(configuration.getProperties()).build(); // Create the SessionFactory from hibernate.cfg.xml return configuration.buildSessionFactory(serviceRegistry); } 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; } } 

配置对象正在读取hibernate.cfg.xml文件中的所有属性。 但是StandardServiceRegistryBuilder对象没有使用这些属性。

这个解决方案对我有用。 以下陈述对于完成这项工作至关重要:

 ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings( configuration.getProperties()).build(); 

完整解决方案

 package demo.jaxrs.util; import org.hibernate.SessionFactory; import org.hibernate.boot.registry.StandardServiceRegistry; 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 { Configuration configuration = new Configuration(); configuration.configure(); System.out.println("Properties: " + configuration.getProperties()); StandardServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder() .applySettings(configuration.getProperties()).build(); // Create the SessionFactory from hibernate.cfg.xml return configuration.buildSessionFactory(serviceRegistry); } 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; } } 

如果方言由于任何其他原因(例如密码已过期)无法​​连接,也会发生这种情况。

检查可能揭示原因的任何早期exception。