正確決解Hibernate4.*中:Connection cannot be null when 'hibernate.dialect' not set


http://www.cnblogs.com/cnscoo/archive/2012/09/17/2689021.html

今天在做Hibernate4.*的項目中,使用了以下的配置:

hibernate.cfg.xml

 1  <?xml version='1.0' encoding='utf-8'?>
 2  <!DOCTYPE hibernate-configuration PUBLIC
 3      "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
 4      "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
 5  <hibernate-configuration>
 6      <session-factory>
 7          <property name="show_sql">true</property>
 8          <property name="format_sql">true</property>
 9          <property name="dialect">org.hibernate.dialect.SQLiteDialect</property>
10          <property name="connection.driver_class">org.sqlite.JDBC</property>
11          <property name="connection.url">jdbc:sqlite:D:\Documents\Dbs\test.db</property>
12          <property name="connection.username"></property>
13          <property name="connection.password"></property>
14  
15          <mapping resource="test/model/Blackey.hbm.xml" />
16      </session-factory>
17  </hibernate-configuration>    

然后在Text.java中測試:

 import org.hibernate.Session;
 import org.hibernate.SessionFactory;
 import org.hibernate.cfg.Configuration;
 import org.hibernate.service.ServiceRegistryBuilder;
 import test.model.Blackey;
 public class Test {
 	public static void main(String [] args){
 		Blackey bk = new Blackey();
 		bk.setName("測試");
 		bk.setVersion("1.0.4");
 		bk.setUid("Test");
 		bk.setKey("1fD46a709C920a01477632");
 		bk.setDescribe("該注冊碼只能用於該版本!");
 		
 		Configuration cfg = new Configuration().configure();
 		SessionFactory sf = cfg.buildSessionFactory(new ServiceRegistryBuilder().buildServiceRegistry());  //以前的cfg.buildSessionFactory()方法被廢棄,查網上大多使用該方法
 		Session session = sf.openSession();
 		session.beginTransaction();
 		session.save(bk);
 		session.getTransaction().commit();
 		session.close();
 		sf.close();
 		
 	}
 }

  結果顯示報錯:

Exception in thread "main" org.hibernate.HibernateException: Connection cannot be null when 'hibernate.dialect' not set
 	at org.hibernate.service.jdbc.dialect.internal.DialectFactoryImpl.determineDialect(DialectFactoryImpl.java:97)
 	at org.hibernate.service.jdbc.dialect.internal.DialectFactoryImpl.buildDialect(DialectFactoryImpl.java:67)
 	at org.hibernate.engine.jdbc.internal.JdbcServicesImpl.configure(JdbcServicesImpl.java:174)
 	at org.hibernate.service.internal.StandardServiceRegistryImpl.configureService(StandardServiceRegistryImpl.java:75)
 	at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:159)
 	at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:131)
 	at org.hibernate.cfg.SettingsFactory.buildSettings(SettingsFactory.java:73)
 	at org.hibernate.cfg.Configuration.buildSettingsInternal(Configuration.java:2283)
 	at org.hibernate.cfg.Configuration.buildSettings(Configuration.java:2279)
 	at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1748)
 	at Test.main(Test.java:19)

  一直讓人很費解,因為顯而易見,我的dialect是明確定義了的(說明一下:我個人已經把org.hibernate.dialect.SQLiteDialect文件打包到了hibernate-core-4.1.*.jar中,所以不會有此類不存在的可能),但為什么說我的dialect未定義呢?

  在網上找相關資料,發現很多人都存在這個問題,可惜沒有發現很好的解決辦法,有人只是測試使用 hibernate.properties來進行配置,則可以成功。個人還是覺得使用xml配置好,轉向國外網站查看,終於看到了一個老外的解決辦法:

SessionFactory sf = cfg.buildSessionFactory(new ServiceRegistryBuilder().buildServiceRegistry());

替換成

SessionFactory sf = cfg.buildSessionFactory(new ServiceRegistryBuilder().applySettings(cfg.getProperties()).buildServiceRegistry());

表示應用hibernate.cfg.xml中的屬性配置,接着運行,發現又錯了:

 Exception in thread "main" org.hibernate.HibernateException: Error applying BeanValidation relational constraints
 	at org.hibernate.cfg.beanvalidation.BeanValidationIntegrator.applyRelationalConstraints(BeanValidationIntegrator.java:219)
 	at org.hibernate.cfg.beanvalidation.BeanValidationIntegrator.integrate(BeanValidationIntegrator.java:126)
 	at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:301)
 	at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1750)
 	at Test.main(Test.java:19)
 Caused by: java.lang.reflect.InvocationTargetException
 	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
 	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
 	at java.lang.reflect.Method.invoke(Method.java:597)
 	at org.hibernate.cfg.beanvalidation.BeanValidationIntegrator.applyRelationalConstraints(BeanValidationIntegrator.java:208)
 	... 4 more
 Caused by: org.hibernate.HibernateException: Unable to build the default ValidatorFactory
 	at org.hibernate.cfg.beanvalidation.TypeSafeActivator.getValidatorFactory(TypeSafeActivator.java:524)
 	at org.hibernate.cfg.beanvalidation.TypeSafeActivator.applyDDL(TypeSafeActivator.java:119)
 	... 9 more
 Caused by: javax.validation.ValidationException: Unable to instantiate Configuration.
 	at javax.validation.Validation$GenericBootstrapImpl.configure(Validation.java:272)
 	at javax.validation.Validation.buildDefaultValidatorFactory(Validation.java:111)
 	at org.hibernate.cfg.beanvalidation.TypeSafeActivator.getValidatorFactory(TypeSafeActivator.java:521)
 	... 10 more
 Caused by: java.lang.NullPointerException
 	at java.util.ResourceBundle.getBundle(ResourceBundle.java:960)
 	at org.hibernate.validator.engine.ResourceBundleMessageInterpolator.loadBundle(ResourceBundleMessageInterpolator.java:202)
 	at org.hibernate.validator.engine.ResourceBundleMessageInterpolator.getFileBasedResourceBundle(ResourceBundleMessageInterpolator.java:182)
 	at org.hibernate.validator.engine.ResourceBundleMessageInterpolator.<init>(ResourceBundleMessageInterpolator.java:81)
 	at org.hibernate.validator.engine.ResourceBundleMessageInterpolator.<init>(ResourceBundleMessageInterpolator.java:73)
 	at org.hibernate.validator.engine.ConfigurationImpl.<init>(ConfigurationImpl.java:57)
 	at org.hibernate.validator.HibernateValidator.createGenericConfiguration(HibernateValidator.java:43)
 	at javax.validation.Validation$GenericBootstrapImpl.configure(Validation.java:269)
 	... 12 more

從網上搜了一下,發現還需要在hibernate.cfg.xml中加入一條配置:

<property name="javax.persistence.validation.mode">none</property>

關鍵在於Unable to instantiate Configuration, 如不添加默認會要求Validation provider。

做完這些,然后運行Test.java,一切正常。 OK,問題解決。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM