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