2013-05-05 3 views
0

Добрый вечер, я получил вышеописанное исключение при использовании Hibernate с JSF, я видел это много раз в прошлом, и основная причина заключалась в следующем: <session-factory name="sessionFactory">, поэтому я удалил имя и изменить сгенерированный код для создания SessionFactory от:java.lang.IllegalStateException: Не удалось найти SessionFactory в JNDI

protected SessionFactory getSessionFactory() { 
    try { 
     return (SessionFactory) new InitialContext() 
       .lookup("SessionFactory"); 
    } catch (Exception e) { 
     log.error("Could not locate SessionFactory in JNDI", e); 
     throw new IllegalStateException(
       "Could not locate SessionFactory in JNDI"); 
    } 
} 

к тому, что:

protected SessionFactory getSessionFactory() { 
    try { 
     return new Configuration().configure("hibernate.cfg.xml").buildSessionFactory(); 
    } catch (Exception e) { 
     log.error("Could not locate SessionFactory in JNDI", e); 
     throw new IllegalStateException(
       "Could not locate SessionFactory in JNDI"); 
    } 
} 

он работал хорошо со мной, но на этот раз я не имею никакого решения к нему, вы не знаете где проблема?

hibernate-cfg.xml

<hibernate-configuration> 
<session-factory> 
    <property name="hibernate.bytecode.use_reflection_optimizer">false</property> 
    <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> 
    <property name="hibernate.connection.password">root</property> 
    <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/GUNO</property> 
    <property name="hibernate.connection.username">root</property> 
    <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> 
    <property name="hibernate.search.autoregister_listeners">false</property> 
</session-factory> 

ответ

0

Вы можете вручную добавить SessionFactory в контексте. Хотя это выглядит как много кода, это действительно только эти 5 строк. Остальное просто обрабатывает исключение NamingException, которое InitialContext, похоже, любит бросать.

Лучше было бы использовать ContextListener для автоматического добавления сеанса во время запуска

InitialContext initialContext = new InitialContext(); 
SessionFactory sf = (SessionFactory) initialContext.lookup("SessionFactory"); 
Configuration cfg = new Configuration(); 
cfg.configure(); 
sf = cfg.buildSessionFactory(); 
initialContext.bind("SessionFactory", sf); 

Вот полный метод Servlet goGet

protected void doGet(HttpServletRequest request, 
     HttpServletResponse response) throws ServletException, IOException { 
    Account acc; 
    InitialContext initialContext = null; 
    acc = new Account("asdf" + String.valueOf(new Date().getTime()), "asdf"); 
    AccountHome home; 
    Transaction tx = null; 
    SessionFactory sf; 

      // Create an instance of the InitialContext 
      // So that we can lookup the SessionFactory property 
      // or add it if it does not yet exist 
    try { 

     initialContext = new InitialContext(); 

    } catch (NamingException e) { 
     throw new ServletException("Unable to create InitalContext", e); 
    } 

      // Since SessionFactories are very expensive to create 
      // first attempt to lookup a cached instance of the SessionFactory 
    try { 
     sf = (SessionFactory) initialContext.lookup("SessionFactory"); 
    } catch (NamingException e) { 
        // There is currently no session factory bound to this context 
        // Manually create it and bind it 
     Configuration cfg; 
     cfg = new Configuration(); 
     cfg.configure(); 
     sf = cfg.buildSessionFactory(); 

     try { 
      initialContext.bind("SessionFactory", sf); 
     } catch (NamingException e1) { 
      throw new ServletException(
        "Unable to bind the SessionFactory to the Inital Context"); 
     } 
    } 

      // Start the transaction and perform work 
    tx = sf.getCurrentSession().beginTransaction(); 
    try { 
     home = new AccountHome(); 
     home.persist(acc); 
     tx.commit(); 
    } catch (Exception e) { 
     tx.rollback(); 
     throw new ServletException("Work failed", e); 
    } 

} 

EDIT: Добавлена ​​ContextListener

package ch.yaawi.platform; 

import javax.naming.InitialContext; 
import javax.naming.NamingException; 
import javax.servlet.ServletContextEvent; 
import javax.servlet.ServletContextListener; 

import org.hibernate.SessionFactory; 
import org.hibernate.cfg.Configuration; 

public class SessionFactoryListener implements ServletContextListener { 

private SessionFactory mSessionFactory; 

public void contextDestroyed(ServletContextEvent event) { 

    if (mSessionFactory != null && !mSessionFactory.isClosed()) { 
     mSessionFactory.close(); 
    } 

} 

public void contextInitialized(ServletContextEvent event) { 
    InitialContext initialContext = null; 
    try { 

     initialContext = new InitialContext(); 

    } catch (NamingException e) { 
     throw new RuntimeException("Unable to create InitalContext", e); 
    } 

    try { 
     mSessionFactory = (SessionFactory) initialContext 
       .lookup("SessionFactory"); 
    } catch (NamingException e) { 
     Configuration cfg; 
     cfg = new Configuration(); 
     cfg.configure(); 
     mSessionFactory = cfg.buildSessionFactory(); 

     try { 
      initialContext.bind("SessionFactory", mSessionFactory); 
     } catch (NamingException e1) { 
      throw new RuntimeException(
        "Unable to bind the SessionFactory to the Inital Context"); 
     } 
    } 

} 

} 

Затем в ваш web.xml

<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd" > 

<web-app> 
<display-name>Archetype Created Web Application</display-name> 

<listener> 
    <listener-class>ch.yaawi.platform.SessionFactoryListener</listener-class> 
</listener> 

</web-app> 

Из-за необходимости изменить пространство имен на свои собственные.

Надеется, что это помогает кому-то

0

Извините, что некро, но я подумал, что, так как это не было помечено как ответили, возможно, это было бы хорошо. Другие, возможно, стали жертвами той же ловушки, что и я.

Недавно я столкнулся с подобными проблемами после слияния некоторых HBM. Впоследствии у меня возникли проблемы, связанные с ошибками поиска JNDI и sessionFactory из-за дублирования сопоставлений классов в файлах HBM, из-за которых невозможно запустить службу JNDI/SessionFactory.

Итак, в начале - убедитесь, что вы не объявляя дублирующие классы в ваших картографических файлах :)

Возможно, это может быть и не так, как кому-то нужен этот вопрос, но это была моя проблема :)

Смежные вопросы