欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Hibernate的JNDI绑定分析

程序员文章站 2024-02-10 23:20:40
hibernate的jndi名称绑定是在net.sf.hibernate.impl.sessionfactoryobjectfactory程序里面实现的,我来分析一下hib...
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实例。