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实例。
我们获得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实例。
上一篇: C#使用linq查询大数据集的方法