Hibernate 4+ 所帶來的改變
近期為了仔細的學習了一下Hibernate,就在官網上下了最新的hibernate-release-4.1.9.Final 版本,筆者最開始接觸Hibernate時是3+版本,雖然4+版本帶來了一下改變不是很大,但是搭建一個新的Hibernate框架對于一個不能夠真正理解Hibernate的心的人來說也不是一件信手拈來的事,我在搭建的時候遇到了很多疑惑,最讓我不解的是最新版本的英文版手冊貌似跟3+版本相差不大。目前遇到的問題在官網、手冊、源碼和各大高手的博客上都得到了解決,此篇就是整理于各位大拿的的博客以及自己的見解,如涉有錯誤歡迎指出。
- 創建SessionFactory時buildSessionFactory()方法過期
SessionFactory sf = new Configuration() .configure() // 直接用hibernate.cfg.xml來進行配置和創建 .buildSessionFactory();B 在4.0.0版本中,因Configuration().configure()方法被廢除了,故用以下方式來創建
Configuration config = new Configuration() .addResource("org/monday/domain/Customer.hbm.xml"); ServiceRegistry serviceRegistry = new ServiceRegistryBuilder() .buildServiceRegistry(); SessionFactory sf = config.buildSessionFactory(serviceRegistry);在此方法中默認使用hibernate.properties文件來進行配置,而hibernate.properties文件中不能添加映射文件(.hbm.xml),所以只能用.addResource("org/monday/domain/Customer.hbm.xml")來添加映射文件,這里必須是全路徑。
使用如下方法時,讀取hibernate.cfg.xml時會出錯(找不到元素 'hibernate-configuration' 的聲明)
Unable to perform unmarshalling at line number 4 and column 26 in RESOURCE hibernate.cfg.xml
可能是這個版本對DTD不識別,或者是方法運用錯誤。
ServiceRegistry serviceRegistry = new ServiceRegistryBuilder() .configure() //想通過這個來讀取hibernate.cfg.xml來進行配置 .buildServiceRegistry(); SessionFactory sf = new MetadataSources( serviceRegistry ) .buildMetadata() .buildSessionFactory();C 在4.0及以上版本中,用hibernate.cfg.xml來創建sessionFactory的方法
從Hibernate 4之后,Configuration類中,原先常用的,獲取SessionFactory的方法buildSessionFactory()被標記為過時,官方建議使用buildSessionFactory(ServiceRegistry sr)這個方法來獲取SessionFactory。新的方法,我理解,是因為用戶有可能(雖然很罕見)根據不同的cfg.xml文件來創建出不同的Configuration對象實例,新的方法可以根據不同的實例來構建出不同的ServiceRegistry,進而得到不同需求的sessionFactory.
這樣做的具體用例我雖然還沒有遇到,但是可以想象,新的方法對分布式數據庫將有良好的支持。
比如,一個分布式數據庫系統中包含了分布在多個不同主機,不同類型的數據庫,我們開發一個WEB應用,要求對這些數據庫都要進行操作,假如這些數據庫的信息分別寫在了多個cfg.xml中,那么,我們就可以根據這些不同的配置文件,生成針對不同數據庫SessionFactory,并將其保存在一個Map中,數據庫名作為鍵值,這樣我們就可以在實現DAO層的時候,根據訪問不同數據庫的需要而獲取到不用的Session.
private static final SessionFactory sessionFactory = buildSessionFactory(); private static ServiceRegistry serviceRegistry; Configuration configuration = new Configuration(); configuration.configure(); serviceRegistry = new ServiceRegistryBuilder().applySettings( configuration.getProperties()).buildServiceRegistry(); return configuration.buildSessionFactory(serviceRegistry);
package cn.com.zyx.model; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; import org.hibernate.service.ServiceRegistry; import org.hibernate.service.ServiceRegistryBuilder; public class StudentTest { public static void main(String[] args) { Student s = new Student(); s.setName("111"); s.setSex("男"); Configuration cfg = new Configuration(); cfg.configure(); //SessionFactory sf=cfg.configure().buildSessionFactory();//*過期方法*解析Hibernate.cfg.xml 然后返回一個已經擁有配置選項的Configuration ServiceRegistry sr=new ServiceRegistryBuilder().applySettings(cfg.getProperties()).buildServiceRegistry(); //SessionFactory類似數據庫庫的一個Connection SessionFactory sf =cfg.buildSessionFactory(sr); //打開一個連接 Session session =sf.openSession(); //開始一個事務 session.beginTransaction(); session.save(s); //獲得一個事務,并提交 session.getTransaction().commit(); //關閉連接 session.close(); //關閉工廠 sf.close(); } }
- 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:303)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1750)
at cn.com.zyx.model.StudentTest.main(StudentTest.java:20)
Caused by: java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
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
來自:http://blog.csdn.net/zyxesc/article/details/8591999