Hibernate 5的启动过程分析之SessionFactory

通过前面的学习,我们知道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();

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值