2014-02-05 2 views
2

Я изучаю сервлеты Java и спящий режим. У меня есть отдельные рабочие примеры для каждого, и теперь я пытаюсь объединить пример спящего режима в http-сервлет.Как инициализировать сеанс спящего режима изнутри сервлета?

Мой простой пример спящего режима начинается с этого кода

factory = new AnnotationConfiguration().configure().buildSessionFactory(); 
Session session = factory.openSession(); 

Когда HTTP сервлет называется через HTTP GET, я понимаю, что это первый вызов конструктора, а затем метод doGet.

Теперь мой вопрос (пожалуйста, будьте спокойны, поскольку я новичок здесь): что такое принятый способ вызова кода инициализации спящего режима из сервлета? Я помещаю вышеуказанный код инициализации в метод конструктора?

+0

Обычно вы делаете это в своем методе 'init()' или в 'ServletContextListener'. –

+0

Если вам нужен объект сеанса спящего режима в методе doGet или doPost. вы должны создать объект сеанса по методу init. и объявить объект сеанса в области класса. – Ajit

ответ

5

Существует множество способов управления сеансом спящего режима. Одним из наиболее распространенных способов является использование класса HibernateUtil. Обычная реализация - статически инициализируется SessionFactory, что означает, что инициализация будет выполняться только один раз (когда класс загружен). Затем он предоставляет статический метод для получения встроенного экземпляра SessionFactory. Вот пример реализации из dzone.

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

public class HibernateUtil { 
    private static final SessionFactory sessionFactory; 
    static { 
     try { 
      sessionFactory = new Configuration().configure() 
        .buildSessionFactory(); 
     } catch (Throwable ex) { 
      System.err.println("Initial SessionFactory creation failed." + ex); 
      throw new ExceptionInInitializerError(ex); 
     } 
    } 

    public static SessionFactory getSessionFactory() { 
     return sessionFactory; 
    } 
} 

Для открытия и закрытия сессии, как правило, рассматриваются как единое целое с обработкой запроса, так что вы звоните HibernateUtil.getSessionFactory().openSession() в начале doGet или doPost и обеспечить, чтобы закрыть сессию до конца метода ,

+0

Спасибо! Я попытался реализовать это, но я получаю сообщение об ошибке «tomcat7 at localhost не удалось запустить» при вызове openSession() в doGet(), потому что кажется, что код инициализации SessionFactory в классе HibernateUtil не вызывается. Что я делаю не так? – draca

3

Создайте один отдельный класс для подключения Hibernet.

package com.abc.xyz.dao; 

    import org.hibernate.SessionFactory; 
    import org.hibernate.cfg.AnnotationConfiguration; 


    public class HibernateUtil { 

     private static final SessionFactory sessionFactory = buildSessionFactory(); 

     @SuppressWarnings("deprecation") 
    private static SessionFactory buildSessionFactory() { 
     try { 
      // Create the SessionFactory from Annotation 
      return new AnnotationConfiguration().configure().buildSessionFactory(); 
     } 
     catch (Throwable ex) { 
      // Make sure you log the exception, as it might be swallowed 
      System.err.println("Initial SessionFactory creation failed." + ex); 
      throw new ExceptionInInitializerError(ex); 
     } 
     } 

     public static SessionFactory getSessionFactory() { 
     return sessionFactory; 
     } 
    } 

на стороне сервера получить соединение для этого

 Session session=null; 

    try { 
     session =HibernateUtil.getSessionFactory().openSession(); 



    } catch (HibernateException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    }finally 
    { 
     session.close(); 
    } 
-4

Попробуйте с сервлета слушателю.

+1

Не могли бы вы расширить свой ответ чуть более? –

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