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實例
From:http://tw.wingwit.com/Article/program/Java/ky/201311/28050.html