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();
对应地,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();
相关文章推荐
- bootstrap初试进度条
- Bootstrap 3.3.4 发布,Web 前端 UI 框架
- angular 指令简述
- 基于BootStrap Metronic开发框架经验小结【六】对话框及提示框的处理和优化
- Bootstrap教程JS插件弹出框学习笔记分享
- Bootstrap框架动态生成Web页面文章内目录的方法
- JS组件Bootstrap Table使用实例分享
- Bootstrap表单组件教程详解
- Bootstrap每天必学之前端开发框架
- Bootstrap 粘页脚效果
- bootstrap-wysiwyg结合ajax实现图片上传实时刷新功能
- JS组件中bootstrap multiselect两大组件较量
- Bootstrap模仿起筷首页效果
- 基于Bootstrap的网页设计实例
- Bootstrap表格和栅格分页实例详解
- 基于BootStrap Metronic开发框架经验小结【四】Bootstrap图标的提取和利用
- BootStrap实用代码片段之一
- JS组件Bootstrap dropdown组件扩展hover事件
- Bootstrap Paginator分页插件使用方法详解
- 浅谈bootstrap源码分析之scrollspy(滚动侦听)