当前位置: 移动技术网 > IT编程>开发语言>Java > Hibernate的JNDI绑定分析

Hibernate的JNDI绑定分析

2017年12月12日  | 移动技术网IT编程  | 我要评论
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实例。

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网