Hibernate源代码分析(一):设计属于我的SessionFactory和ConnectionProvider

 过完五一长假,花了四天的时间来学习Hibernate框架的使用,作为门外汉,先是从sourceforg.net下载 Hibernate3.2,先看官方文档,只有一个提纲,了解了一下各个包的结构,便开始根据Toturial实践,基本掌握了它的使用方法之后,盟生了 实现自己的SessionFactory和ConnectionProvider的想法。
         闲话少说,要实现我的SessionFactory和ConnectionProvider,不深入了解该体系结构是不行的,先从源代码分析开始:          首先从org.hibernate.cfg.Configuration.java开始,使用Hibernate框架实现应用程序,首先就要与org.hibernate.cfg.Configuration打交道,要使用
Configuration.buildSessionFactory()方法获得一个SessionFactory,截取代码片段如下:
         
         
1 public  SessionFactory buildSessionFactory()  throws  HibernateException  {
2    
3        return new SessionFactoryImpl(
4                this,
5                mapping,
6                settings,
7                getInitializedEventListeners()
8            );
9    }

         上面的代码片断省略了读取Hibernate配置的代码,从这个我们可以知道,Configuration类buildSessionFactory()方法实际上返回了SessionFactory接口的实现SessionFactoryImpl。
         
          当我们得到了一个SessionFactory接口的实现SessionFactoryImpl,就要调用它的getCurrentSession()方 法来获得一个Session,接下来转到org.hibernate.impl.SessionFactoryImpl.java,来看看 getCurrentSession()方法的实现,代码片段如下:
1      public  org.hibernate.classic.Session getCurrentSession()  throws  HibernateException  {
2        if ( currentSessionContext == null ) {
3            throw new HibernateException( "No CurrentSessionContext configured!" );
4        }

5        return currentSessionContext.currentSession();
6    }

         在该方法中,SessionFactoryImpl将获得Session的工作委托给了currentSessionContext.currentSession(),currentSessionContext为何物?其定义为:
org.hibernate.context.CurrentSessionContext;在SessionFactoryImpl的构造函数中,可以看到:

currentSessionContext  =  buildCurrentSessionContext();

         马上追溯到buildCurrentSessionContext()方法,代码片段如下:

 1      private  CurrentSessionContext buildCurrentSessionContext()  {
 2        String impl = properties.getProperty( Environment.CURRENT_SESSION_CONTEXT_CLASS );
 3        // for backward-compatability
 4        if ( impl == null && transactionManager != null ) {
 5            impl = "jta";
 6        }

 7
 8        if ( impl == null ) {
 9            return null;
10        }

11        else if ( "jta".equals( impl ) ) {
12            if ( settings.getTransactionFactory().areCallbacksLocalToHibernateTransactions() ) {
13                log.warn( "JTASessionContext being used with JDBCTransactionFactory; auto-flush will not operate correctly with getCurrentSession()" );
14            }

15            return new JTASessionContext( this );
16        }

17        else if ( "thread".equals( impl ) ) {
18            return new ThreadLocalSessionContext( this );
19        }

20        else if ( "managed".equals( impl ) ) {
21            return new ManagedSessionContext( this );
22        }

23        else {
24            try {
25                Class implClass = ReflectHelper.classForName( impl );
26                return ( CurrentSessionContext ) implClass
27                        .getConstructor( new Class[] { SessionFactoryImplementor.class } )
28                        .newInstance( new Object[] this } );
29            }

30            catch( Throwable t ) {
31                log.error( "Unable to construct current session context [" + impl + "]", t );
32                return null;
33            }

34        }

35    }

36

         从这里可以发现,SessionFactoryImpl用反射实现了CurrentSessionContext接口的动态装配。
         接下来,暂时将视线从SessionFactoryImpl移开,以org.hibernate.context.JTASessionContext为代表,看CurrentSessionContext接口是如何实现
的currentSession()方法的,打开org.hibernate.context.JTASessionContext.java,找到currentSession(),代码片段如下:

1      public  Session currentSession()  throws  HibernateException  {
2
3if ( currentSession == null ) {
4            currentSession = buildOrObtainSession();
5
6}

7
8return currentSession;
9}

        转移到buildOrObtainSession()方法,

1      protected  Session buildOrObtainSession()  {
2        return factory.openSession(
3                null,
4                isAutoFlushEnabled(),
5                isAutoCloseEnabled(),
6                getConnectionReleaseMode()
7            );
8    }
   

         前面SessionFactoryImpl.buildCurrentSessionContext()方法有new JTASessionContext( this ),而此时的factory.openSessio()就是SessionFactoryImpl.openSessio()了。

         将目光焦点回到org.hibernate.impl.SessionFactoryImpl.java,  SessionFactoryImpl.openSessio()的实现如下:

 1      private  SessionImpl openSession(
 2         Connection connection,
 3          boolean  autoClose,
 4          long  timestamp,
 5         Interceptor sessionLocalInterceptor
 6     )  {
 7        return new SessionImpl(
 8                connection,
 9                this,
10                autoClose,
11                timestamp,
12                sessionLocalInterceptor == null ? interceptor : sessionLocalInterceptor,
13                settings.getDefaultEntityMode(),
14                settings.isFlushBeforeCompletionEnabled(),
15                settings.isAutoCloseSessionEnabled(),
16                settings.getConnectionReleaseMode()
17            );
18    }
       
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
校园悬赏任务平台对字典管理、论坛管理、任务资讯任务资讯公告管理、接取用户管理、任务管理、任务咨询管理、任务收藏管理、任务评价管理、任务订单管理、发布用户管理、管理员管理等进行集中化处理。经过前面自己查阅的网络知识,加上自己在学校课堂上学习的知识,决定开发系统选择小程序模式这种高效率的模式完成系统功能开发。这种模式让操作员基于浏览器的方式进行网站访问,采用的主流的Java语言这种面向对象的语言进行校园悬赏任务平台程序的开发,在数据库的选择上面,选择功能强大的Mysql数据库进行数据的存放操作。校园悬赏任务平台的开发让用户查看任务信息变得容易,让管理员高效管理任务信息。 校园悬赏任务平台具有管理员角色,用户角色,这几个操作权限。 校园悬赏任务平台针对管理员设置的功能有:添加并管理各种类型信息,管理用户账户信息,管理任务信息,管理任务资讯公告信息等内容。 校园悬赏任务平台针对用户设置的功能有:查看并修改个人信息,查看任务信息,查看任务资讯公告信息等内容。 系统登录功能是程序必不可少的功能,在登录页面必填的数据有两项,一项就是账号,另一项数据就是密码,当管理员正确填写并提交这二者数据之后,管理员就可以进入系统后台功能操作区。项目管理页面提供的功能操作有:查看任务,删除任务操作,新增任务操作,修改任务操作。任务资讯公告信息管理页面提供的功能操作有:新增任务资讯公告,修改任务资讯公告,删除任务资讯公告操作。任务资讯公告类型管理页面显示所有任务资讯公告类型,在此页面既可以让管理员添加新的任务资讯公告信息类型,也能对已有的任务资讯公告类型信息执行编辑更新,失效的任务资讯公告类型信息也能让管理员快速删除。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值