您的位置:首页 > Web前端 > BootStrap

Hibernate 5的启动过程分析之SessionFactory

2016-06-08 12:29 351 查看
通过前面的学习,我们知道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();
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息