通过前面的学习,我们知道Hibernate提供了2组数据访问API,一个是JavaEE标准的JPA,另一个是Hibernate独有的Hibernate Native API。
对应地,Hibernate 5的启动过程也分为两种情况,一种是JPA的EntityManagerFactory实例的构建过程,另一种是Hibernate的Native SessionFactory实例的构建过程。
这里,我们首先介绍Hibernate的Native SessionFactory实例的构建过程。
Hibernate的Native SessionFactory实例的构建过程可以分为4个阶段:
- 构建ServiceRegistry
- 注册Event Listener
- 构建Metadata
- 构建SessionFactory
1. 构建ServiceRegistry
构建ServiceRegistry的目的主要是启动后续所需的各种services。
Hibernate 5提供了两种ServiceRegistry:
- org.hibernate.boot.registry.BootstrapServiceRegistry
- org.hibernate.boot.registry.StandardServiceRegistry
1) BootstrapServiceRegistry通常无需配置,其主要负责启动如下3种服务:
- org.hibernate.boot.registry.classloading.spi.ClassLoaderService
- org.hibernate.integrator.spi.IntegratorService
- org.hibernate.boot.registry.selector.spi.StrategySelector
2)StandardServiceRegistry负责为后续启动过程的元数据配置阶段做准备
通常需要配置,通过org.hibernate.boot.registry.StandardServiceRegistryBuilder实现。
2. 注册Event Listener
目前,主要是SPI服务和事件监听器的注册。
需要通过org.hibernate.event.service.spi.EventListenerRegistry实现。
3. 构建Metadata
即通过XML配置或标注,初始化Entity模型及其与数据库的映射。
需要通过如下API实现:
- org.hibernate.boot.Metadata
- org.hibernate.boot.MetadataSources
4. 构建SessionFactory实例
在上述3个阶段的基础上,就可以通过构建模式,直接构建出SessionFactory实例了。
采用Metadata的配置参数,示例如下:
StandardServiceRegistry standardRegistry = new StandardServiceRegistryBuilder()
.configure( "org/hibernate/example/hibernate.cfg.xml" )
.build();
Metadata metadata = new MetadataSources( standardRegistry )
.addAnnotatedClass( MyEntity.class )
.addAnnotatedClassName( "org.hibernate.example.Customer" )
.addResource( "org/hibernate/example/Order.hbm.xml" )
.addResource( "org/hibernate/example/Product.orm.xml" )
.getMetadataBuilder()
.applyImplicitNamingStrategy( ImplicitNamingStrategyJpaCompliantImpl.INSTANCE )
.build();
SessionFactory sessionFactory = metadata.getSessionFactoryBuilder()
.applyBeanManager( getBeanManager() )
.build();
如果还需要修改Metadata的配置,则需要借助于org.hibernate.boot.SessionFactoryBuilder,示例如下:
StandardServiceRegistry standardRegistry = new StandardServiceRegistryBuilder()
.configure( "org/hibernate/example/hibernate.cfg.xml" )
.build();
Metadata metadata = new MetadataSources( standardRegistry )
.addAnnotatedClass( MyEntity.class )
.addAnnotatedClassName( "org.hibernate.example.Customer" )
.addResource( "org/hibernate/example/Order.hbm.xml" )
.addResource( "org/hibernate/example/Product.orm.xml" )
.getMetadataBuilder()
.applyImplicitNamingStrategy( ImplicitNamingStrategyJpaCompliantImpl.INSTANCE )
.build();
SessionFactoryBuilder sessionFactoryBuilder = metadata.getSessionFactoryBuilder();
// Supply an SessionFactory-level Interceptor
sessionFactoryBuilder.applyInterceptor( new CustomSessionFactoryInterceptor() );
// Add a custom observer
sessionFactoryBuilder.addSessionFactoryObservers( new CustomSessionFactoryObserver() );
// Apply a CDI BeanManager ( for JPA event listeners )
sessionFactoryBuilder.applyBeanManager( getBeanManager() );
SessionFactory sessionFactory = sessionFactoryBuilder.build();