【问题标题】: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
【解决方案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;
}
}