2010-03-19 2 views
3

это как сеанс завод должен быть получен:Hibernate SessionFactory: как настроить JNDI в Tomcat?

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

Просьба предоставить простое решение для Tomcat6, чтобы иметь возможность получить SessionFactory через простой JNDI поиска в Java коде. Что должно быть написано в каком файле на стороне Tomcat?

ответ

0

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; 
    } 
} 
Смежные вопросы