Hibernate的JNDI绑定阐明
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实例。