Hibernate 4+ 所带来的改变
近期为了仔细的学习了一下Hibernate,就在官网上下了最新的hibernate-release-4.1.9.Final 版本,笔者最开始接触Hibernate时是3+版本,虽然4+版本带来了一下改变不是很大,但是搭建一个新的Hibernate框架对于一个不能够真正理解Hibernate的心的人来说也不是一件信手拈来的事,我在搭建的时候遇到了很多疑惑,最让我不解的是最新版本的英文版手册貌似跟3+版本相差不大。目前遇到的问题在官网、手册、源码和各大高手的博客上都得到了解决,此篇就是整理于各位大拿的的博客以及自己的见解,如涉有错误欢迎指出。
创建SessionFactory时buildSessionFactory()方法过期 A 在3.6.8版本中,可以直接用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")来添加映射文件,这里必须是全路径。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 然后返回一个已经拥有配置选项的ConfigurationServiceRegistry sr=new ServiceRegistryBuilder().applySettings(cfg.getProperties()).buildServiceRegistry();//SessionFactory类似数据库库的一个ConnectionSessionFactory sf =cfg.buildSessionFactory(sr);//打开一个连接Session session =sf.openSession();//开始一个事务session.beginTransaction();session.save(s);//获得一个事务,并提交session.getTransaction().commit();//关闭连接session.close();//关闭工厂sf.close();}}