【问题标题】:Hibernate SessionFactory: how to configure JNDI in Tomcat?Hibernate SessionFactory:如何在 Tomcat 中配置 JNDI?
【发布时间】:2011-01-29 09:02:33
【问题描述】:

这就是会话工厂的获取方式:

受保护的会话工厂 getSessionFactory() { 尝试 { return (SessionFactory) new InitialContext() .lookup("SessionFactory"); } 捕捉(异常 e){ } }

请提供一个简单的解决方案,让Tomcat6能够获得SessionFactory 通过 Java 代码中的简单 jndi 查找。 Tomcat那边什么文件应该写什么?

【问题讨论】:

    标签: java hibernate tomcat jndi sessionfactory


    【解决方案1】:

    这是一个链接 http://community.jboss.org/wiki/UsingJNDI-boundSessionFactorywithTomcat41

    但也欢迎其他答案。

    【讨论】:

      【解决方案2】:

      Tomcat 文档says:

      Tomcat 提供了只读的InitialContext,而 Hibernate 需要 读写以管理多个会话工厂。雄猫是 显然遵循非托管容器的规范。如果 你想将会话工厂绑定到一个 JNDI 对象,你要么 必须移动到托管服务器(Glassfish、JBoss 等),或搜索 在 Internet 上查看一些已发布的解决方法。

      Hibernate 文档的建议是离开 使用 hibernate.session_factory_name 属性 Tomcat 不尝试绑定到 JNDI。

      Hibernate 文档说 the same:

      将 SessionFactory 绑定到 JDNI 命名空间非常有用。在 大多数情况下,可以使用hibernate.session_factory_name 您的配置中的属性。但是,你不能使用 Tomcat hibernate.session_factory_name 属性,因为 Tomcat 提供 只读 JNDI 实现。将 JNDI 绑定 SessionFactory 与 Tomcat,你应该为 SessionFactory 并设置它 Tomcat 的配置。

      所以你需要像这样自定义SessionFactory:

      package myutil.hibernate;  
      
      import java.util.Hashtable;  
      import java.util.Enumeration;  
      import javax.naming.Name;  
      import javax.naming.Context;  
      import javax.naming.NamingException;  
      import javax.naming.Reference;  
      import javax.naming.RefAddr;  
      import javax.naming.spi.ObjectFactory  
      import org.hibernate.SessionFactory;  
      import org.hibernate.cfg.Configuration;  
      
      public class HibernateSessionFactoryTomcatFactory implements ObjectFactory{  
         public Object getObjectInstance(Object obj, Name name, Context cntx, Hashtable env)   
                       throws NamingException{  
      
            SessionFactory sessionFactory = null;  
            RefAddr addr = null;  
      
            try{  
               Enumeration addrs = ((Reference)(obj)).getAll();  
      
               while(addrs.hasMoreElements()){  
                  addr = (RefAddr) addrs.nextElement();  
                  if("configuration".equals((String)(addr.getType()))){  
                     sessionFactory = (new Configuration())  
                          .configure((String)addr.getContent()).buildSessionFactory();  
                  }  
               }  
            }catch(Exception ex){  
               throw new javax.naming.NamingException(ex.getMessage());  
            }  
      
            return sessionFactory;  
         }  
      }  
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-05-30
        • 2015-12-31
        • 1970-01-01
        • 2013-06-10
        • 1970-01-01
        • 1970-01-01
        • 2013-04-23
        • 1970-01-01
        相关资源
        最近更新 更多