Tomcat документация says:
Tomcat обеспечивает только для чтения InitialContext
, в то время как Hibernate требует чтения и записи для того, чтобы управлять несколько сессионных заводами. Tomcat , очевидно, следуя спецификации для неуправляемых контейнеров. Если вы хотите привязать фабрику сеансов к объекту JNDI, вам необходимо либо перейти на управляемый сервер (Glassfish, JBoss, и т. Д.), Либо выполнить поиск в Интернете для некоторых размещенных работ.
рекомендация из документации Hibernate является просто оставить вне hibernate.session_factory_name
собственности при работе с Tomcat не пытаться привязки к JNDI.
И Hibernate документация говорит the same:
Это очень полезно, чтобы связать ваш SessionFactory к JDNI имен. В в большинстве случаев можно использовать hibernate.session_factory_name
недвижимость в вашей конфигурации. Но с Tomcat вы не можете использовать hibernate.session_factory_name
, потому что Tomcat предоставляет реализацию JNDI только для чтения. Чтобы использовать JNDI-bound 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;
}
}