2010-03-19 18 views
3

voilà comment devrait être obtenu l'usine de session:Hibernate SessionFactory: comment configurer JNDI dans Tomcat?

 
    protected SessionFactory getSessionFactory() { 
     try { 
      return (SessionFactory) new InitialContext() 
        .lookup("SessionFactory"); 
     } catch (Exception e) { 
     } 
    } 

S'il vous plaît fournir une solution simple pour Tomcat6 pour être en mesure d'obtenir SessionFactory à travers recherche JNDI simple code Java. Ce qui devrait être écrit dans quel fichier sur le côté de Tomcat?

Répondre

0

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; 
    } 
}