一、加载hibernate的相关jar包(通过maven)
1、通过maven来管理jar包,可以通过下列网址来搜索你想要的获取maven的坐标。
http://mvnrepository.com/
如加载hiberante的坐标为
<dependencies>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>4.2.3.Final</version>
</dependency>
</dependencies>
二、获取SessionFactory对象
1、在4.0版本之前获取该对象的方法为:
默认情况下Hibernate会去classPath下加载hibernate.cfg.xml文件,如果你没有采用默认的配置文件名,那么你就需要在configurate()方法里面带上你 的配置文件名,如temp.xml。注意路径正确
Configuration configuration = new Configuration().configure();
SessionFactory sessionFactory = configuration.buildSessionFactory();
2、Hibernate4.0之后引入的新特性,Service Register机制。其配置情况如下:
StandardServiceRegistryBuilder serviceRegistryBuilder = new StandardServiceRegistryBuilder();
ServiceRegistry serviceRegistry = serviceRegistryBuilder.build();
SessionFactory sessionFactory = configuration.buildSessionFactory(serviceRegistry);
但是在4.1之后的版本中,StandardServiceRegistryBuilder又被取消了,取而带之的做法是
Configuration configiguration = new Configuration().configure();
ServiceRegistryBuilder builder = new ServiceRegistryBuilder().applySettings(configiguration.getProperties());
ServiceRegistry registry = builder.buildServiceRegistry();
factory = configiguration.buildSessionFactory(registry);
三、Service Register 机制
1、ServiceRegistry 是 Service 的注册表, 它为Service提供了一个统一的加载 / 初始化 / 存放 / 获取机制.
首先看整个类图:
整个 ServiceRegistry 结构和我们大家了解的 Classloader 的代理结构类似, 只不过和 Classloader 的首先代理给父节点,父节点找不到再从本级的 Classloader 中查找的策 略不同,ServiceRegistry 是先从本级节点查找,找不到再去父亲中查找。
可以看到hibernate里面的 ServiceRegistry实际上是由三层(范围)组成的:
----------------------BootstrapServiceRegistry:【主要包括全局都要使用的基础服务】
主要提供 Classloading 和 Service loading 服务, 供全局使用.
----------------------ServiceRegistry:【主要包括在 BootstrapServiceRegistry 之上的, 和Hibernate 相关的服务, 例如配置文件解析, JDBC, JNDI 等】
标准的ServiceRegistry, 同样服务于全局, 在初始化这个Registry中的服务的时候,可能需要使用到BootstrapServiceRegistry中的服务.
----------------------SessionFactoryServiceRegistry:【是和sessionfactory相关的了, 包括2LC的region factory, event listener等.】
于SessionFactory相关联(一对一的关系), 这里面的Services在初始化的时候需要访问SessionFactory.
这里面的层级关系, 对于 service registry的client来说是完全透明的, 你可以直接调用getService 去获取你需要的service, 而不用去关心你在哪个层级上, 如同 classloader.
四、Hibernate中获取的Service包括什么?
Service 就是一个功能,它由一个接口(Service Role)和一个实现类组成.
Service 而这次在新版本中,是通过把这些服务的提供者(类),给抽取成一个个的Service,从而可以用统一的方式进行访问/加载/初始化等.
下图列出了所有的Hibernate中内置的Services, 详细介绍请参考:
原文见:http://planet.jboss.org/post/hibernate_orm_service_registry