documentation Tomcat says:
Tomcat fournit une lecture seule InitialContext
, tout en veille prolongée nécessite lecture-écriture afin de gérer plusieurs usines de session. Tomcat est apparemment suivant la spécification pour les conteneurs non gérés. Si vous souhaitez lier la fabrique de sessions à un objet JNDI, vous devez passer à un serveur géré (Glassfish, JBoss, etc.) ou rechercher sur Internet pour des solutions de rechange.
La recommandation de la documentation Hibernate est de simplement laisser la propriété hibernate.session_factory_name
lorsque vous travaillez avec Tomcat pour ne pas essayer de se lier à JNDI.
Et documentation Hibernate dit the same:
Il est très utile de lier votre SessionFactory à l'espace de noms JDNI. Dans la plupart des cas, il est possible d'utiliser la propriété hibernate.session_factory_name
dans votre configuration. Mais, avec Tomcat, vous ne pouvez pas utiliser la propriété hibernate.session_factory_name
, car Tomcat fournit l'implémentation JNDI en lecture seule . Pour utiliser SessionFactory
lié à JNDI avec Tomcat, vous devez écrire la classe de fabrique de ressources personnalisée pour SessionFactory
et configurer la configuration de Tomcat.
Vous avez donc besoin de faire la coutume SessionFactory
comme ça:
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;
}
}