当前位置: 首页 > 图文教程 > 网络编程 > JSP > Hibernate的JNDI绑定分析

JSP
Jsp常用技巧:图片验证码
JSP教程:JSP页面跳转的实战规则
JSP模板应用指南(上)
JSP由浅入深(3): 通过表达式增加动态内容
JSP由浅入深(5): Scriptlets和HTML的混合
JSP由浅入深(1): 熟悉JSP服务器
JSP由浅入深(12): 表单编辑
JSP由浅入深(11): 标记库
JSP由浅入深(10): Beans and Forms处理
JSP由浅入深(9): JSP Sessions
JSP由浅入深(8): JSP Tags
JSP由浅入深(6): JSP声明
JSP由浅入深(4): Scriptlets
JSP由浅入深(2): 第一个JSP
JSP由浅入深(7): JSP Directives
使用JSP + JAVABEAN + XML 开发的一个例子
快速建立Servlet和JSP的运行、调试和编译环境
利用iText在JSP中生成PDF报表
JSP避免Form重复提交的三种方案
Jsp连接Access数据库(不通过建立ODBC数据源的方法)

JSP 中的 Hibernate的JNDI绑定分析


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-13   浏览: 58 ::
收藏到网摘: n/a

Hibernate的JNDI名称绑定是在net.sf.hibernate.impl.SessionFactoryObjectFactory程序里面实现的,我来分析一下Hibernate的绑定JNDI的过程:
  我们获得SessionFactory一般是这样写代码:
  Configuration conf = new Configuration().addClass(Cat.class);
  SessionFactory sf = conf.buildSessionFactory();
  首先是new Configuration()创建一个Configuration,在这个构造器里面进行配置文件(hibernate.properties)的读取工作,然后保存到一个Properties对象里面去,和JNDI相关的是这个属性:
  hibernate.session_factory_name hibernate/session_factory
  接着调用buildSessionFactory()方法,该方法检查一下配置信息,然后调用SessionFactoryImpl的一个构造器。在构造器里面注意下面两行代码:
  name = properties.getProperty(Environment.SESSION_FACTORY_NAME);
  SessionFactoryObjectFactory.addInstance(uuid, name, this, properties);
  调用了SessionFactoryObjectFactory的addInstance方法,并且把自身(SessionFactory的实例)作为参数传递。最后在addInstance方法可以看到如下代码:
  Context ctx = NamingHelper.getInitialContext(properties);
  NamingHelper.bind(ctx, name, instance);
  instance 就是SessionFactory的实例,通过读源代码,可以清楚的看到Hibernate是在conf.buildSessionFactory()的时候通过一系列类方法调用,把创建的SessionFactory实例绑定到配置文件(hibernate.properties)中 hibernate.session_factory_name属性指定的名称上的,因此可见Hibernate自身是具有JNDI的动态绑定功能的。但是Hibernate需要获得一个SessionFactory实例用于绑定,而这个SessionFactory实例需要我们写代码进行预先创建,并且必须保证该过程要在所有其它要从JNDI上获得SessionFactory实例的程序之前完成。
  因此对于任何App Server来说,我们都不必去管JNDI名称的绑定过程,只需要保证预先创建一个SessionFactory实例出来就够了,剩下的工作 Hibernate会做的。那么如何确保预创建SessionFactory实例呢,如果是Servlet,可以配置一个初始化的Servlet,只要把
  Configuration conf = new Configuration().addClass(Cat.class);
  SessionFactory sf = conf.buildSessionFactory();
  这样的代码加进去就可以了。如果是包含EJB的的复杂的J2EE应用,可能需要依靠App Server的功能来保证预创建SessionFactory实例。