Hibernate源码分析:入门代码流程
关于
对于入门的代码案例,分析其执行流程,有助于理解其设计并熟悉 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();
其过程如下:
- 创建一个 Configuration 对象;
- 调用其 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 类)的对象。
【待续……】