Hibernate SessionFactory: как настроить JNDI в Tomcat? - PullRequest
3 голосов
/ 19 марта 2010

Вот как должна быть получена фабрика сеансов:

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

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

Ответы [ 2 ]

2 голосов
/ 19 марта 2010

Вот ссылка http://community.jboss.org/wiki/UsingJNDI-boundSessionFactorywithTomcat41

Но приветствуются и другие ответы.

0 голосов
/ 04 марта 2017

Документация Tomcat говорит :

Tomcat предоставляет только для чтения InitialContext, в то время как Hibernate требует чтения-записи для управления несколькими фабриками сеансов.Tomcat, очевидно, следует спецификации для неуправляемых контейнеров.Если вы хотите привязать фабрику сеансов к объекту JNDI, вам придется либо перейти на управляемый сервер (Glassfish, JBoss и т. Д.), Либо искать в Интернете некоторые опубликованные обходные пути.

Рекомендация из документации по Hibernate состоит в том, чтобы при работе с Tomcat не указывать свойство hibernate.session_factory_name, чтобы не пытаться связываться с JNDI.

Очень полезно привязать SessionFactory к пространству имен JDNI.В большинстве случаев это можно использовать свойство hibernate.session_factory_name в вашей конфигурации.Но с Tomcat нельзя использовать свойство hibernate.session_factory_name, поскольку Tomcat обеспечивает реализацию JNDI только для чтения.Чтобы использовать JNDI-привязанный SessionFactory с Tomcat, вы должны написать собственный класс фабрики ресурсов для SessionFactory и настроить его для конфигурации Tomcat.

Так что вам нужно сделать пользовательский SessionFactory следующим образом:1026 *

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