Hibernate源码分析:入门代码流程

来自Wikioe
跳到导航 跳到搜索


关于

对于入门的代码案例,分析其执行流程,有助于理解其设计并熟悉 API 的使用。

入门代码:

class HibernateTest{
	@Test
	public void testDemo() {
		// 加载 hibernate 核心配置文件
		Configuration cfg = new Configuration();
		cfg.configure();
		
		// 根据 hibernate 核心配置文件内容,创建 sessionFactory
		SessionFactory sessionFactory = cfg.buildSessionFactory();
		
		// 使用 SessionFactory 创建 session 对象
		Session session = sessionFactory.openSession();
		// Session session = sessionFactory.grtCurrentSession();
		
		
		// 使用事务
		Transaction tx = null;
		
		try{
			// 开启事务
			tx = session.beginTransaction();
			
			// 逻辑代码
			User user = new User();
			user.setUsername("Eijux");
			user.setPassword("123456");
			user.setAddress("成都");
			
			session.save(user);
			
			// 提交事务
			tx.commit();
		}catch(HibernateException e){
			if(tx != null){
				// 回滚事务
				tx.rollback();
			}
			throw e;
		}finally{
			if(session != null){
				// 关闭 session
				session.close();
			}
		}
		

		// 关闭 sessionFactory
		sessionFactory.close();
	}
}

加载核心配置文件

对于:

		Configuration cfg = new Configuration();
		cfg.configure();

其过程如下:

  1. 创建一个 Configuration 对象;
  2. 调用其 configure() 方法:
    public class Configuration {
    	...
    	
    	public Configuration() {
    		this( new BootstrapServiceRegistryBuilder().build() );
    	}
    
    	public Configuration(BootstrapServiceRegistry serviceRegistry) {
    		this.bootstrapServiceRegistry = serviceRegistry;
    		this.metadataSources = new MetadataSources( serviceRegistry );
    		reset();
    	}
    
    	public Configuration(MetadataSources metadataSources) {
    		this.bootstrapServiceRegistry = getBootstrapRegistry( metadataSources.getServiceRegistry() );
    		this.metadataSources = metadataSources;
    		reset();
    	}
    	
    	...
    }
    
    • 有多个重载的构造方法,用于不同加载方式。
    • 其实默认的无参构造函数,将创建一个 BootstrapServiceRegistryImpl 类(继承了 BootstrapServiceRegistryBuilder 类)的对象。

【待续……】

创建 sessionFactory

创建 session

事务