2014-09-22 3 views
2

Im пытается узнать спящий режим и калитки. Im фактически не уверен, когда нужно открыть и закрыть сеанс спящего режима. Я много искал и много читал о фабрике сеансов, но я все равно не понимаю.Hibernate Обработка сеанса

Я хочу получить некоторые данные из моей базы данных и показать их в таблице в браузере. Это на самом деле работает, если им в первый раз на этом сайте, но если я использую кнопку назад и перейти на этот сайт снова он показывает мне эту ошибку:

Last cause: Unknown service requested [org.hibernate.engine.jdbc.connections.spi.ConnectionProvider] 

Я думаю, что его, потому что я закрываю SessionFactory рано или что-то как это. Но я не знаю, как решить проблему.

Мои Java Класс:

public class CategoryPanel extends Panel { 
    private WebMarkupContainer categoryContainer; 
    public CategoryPanel(String id) { 
     super(id); 
     SessionFactory sessionFactory = DbFactory.getSessionFactory();     // creating the Session Factory  
     StandardDao<Category> categoryDao = StandardDao.getInstance(sessionFactory); // creating dao to access data 
     List<Category> categoryList = categoryDao.getAll(Category.class);    // get data of the db 
     CategoryDataProvider dataProvider = new CategoryDataProvider(categoryList);   
     categoryContainer = new WebMarkupContainer("categoryTable"); 

     final DataView dv = new DataView("categoryList", dataProvider) { 

      @Override 
      protected void populateItem(Item item) { 
       final Category category = (Category) item.getModelObject(); 
       final CompoundPropertyModel<Category> categoryModel = new  CompoundPropertyModel<Category>(category); 

       item.add(new Label("catTitle", categoryModel.bind("title"))); 
      } 
     }; 
     categoryContainer.add(new Label("categoryTitle", Model.of("Titel"))); 
     add(categoryContainer); 
     sessionFactory.close(); // here I close the factory, this seems to be wrong. I dont know if i close it anyway.. 
    } 
} 

Мой Dao:

public class StandardDao<T> { 
private static StandardDao instance = null; 
    private static final Object syncObject = new Object(); 
    private SessionFactory sessionFactory; 


    private StandardDao(SessionFactory session){ 
    this.sessionFactory = session; 
    } 

    public static StandardDao getInstance(SessionFactory session) { 
     if (instance == null) { 
      synchronized (syncObject) { 
       if (instance == null) { 
        instance = new StandardDao(session); 
       } 
      } 
     } 
     return instance; 
    } 
     public List<T> getAll(Class theClass) { 
      List<T> entity = null; 
      Session session = sessionFactory.openSession(); 
      try { 
       entity = session.createCriteria(theClass).list(); 
      } catch (RuntimeException e) { 
       e.printStackTrace(); 
      }finally { 
      session.flush(); 
      // if I close the session here, I cant load lazy 
     } 
      return entity; 
     } 
    } 

ответ

4

Вы не должны закрывать SessionFactory. SessionFactory используется для возврата вам сеанса, на котором вы работаете, и закрытия только сеанса.

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

Этот шаблон обычно называется «Открыть сеанс в режиме просмотра».

На веб-сервере Java это обычно делается с фильтром сервлета, который вы настраиваете в своем web.xml.

Поиск в Google Java Java Открыть сеанс в окне просмотра, и вы найдете множество примеров и объяснений.