2017-02-06 3 views
1

Я удаляю объект, передавая id, но он удаляется, но показывает, что «сессия закрыта». Я только что разместил эти два класса, один из которых является контроллером, а другой - методом удаления, когда объект удаляется, но говорит, что «сеанс закрыт».org.hibernate.SessionException: сессия закрыта! error

In CategoryDAOImpl.java class 

     /* 
     * To change this license header, choose License Headers in Project Properties. 
     * To change this template file, choose Tools | Templates 
     * and open the template in the editor. 
     */ 
     package com.acem.sp.dao.impl; 

     import com.acem.sp.dao.CategoryDAO; 
     import com.acem.sp.entity.Category; 
     import java.util.List; 
     import org.hibernate.Query; 
     import org.hibernate.Session; 
     import org.hibernate.SessionFactory; 
     import org.hibernate.Transaction; 
     import org.springframework.beans.factory.annotation.Autowired; 


     import org.springframework.stereotype.Repository; 

     /** 
     * 
     * @author AshwinKArki 
     */ 
     @Repository 
     public class CategoryDAOImpl implements CategoryDAO { 

      @Autowired 
      private SessionFactory sessionFactory; 

      private Session session; 

      private Transaction trans; 
      @Override 
      public List<Category> getAll() { 
       session=sessionFactory.openSession(); 
      Query query=session.getNamedQuery("Category.findAll"); 
      List<Category> catList=query.list(); 
      session.close(); 
      return catList; 
      } 

      @Override 
      public Category getById(int id) { 
       session=sessionFactory.openSession(); 
      Category cat=(Category)session.get(Category.class, id); 
      session.close(); 
      return cat; 
       } 


      @Override 
      public void insert(Category t) { 
       session=sessionFactory.openSession(); 

       trans=session.beginTransaction(); 

       session.save(t); 
       trans.commit(); 
       session.close(); 
      } 

      @Override 
      public void update(Category t) { 
       session=sessionFactory.openSession(); 

       trans=session.beginTransaction(); 

       session.saveOrUpdate(t); 
       trans.commit(); 
       session.close(); 
      } 

      @Override 
      public void delete(int id) { 
       session = session.getSessionFactory().openSession(); 
       trans=session.beginTransaction(); 

      session.delete(getById(id)); 
      trans.commit(); 
       session.flush() ; 
      session.close(); 


      } 

     } 
     In my admincontroller.java class 

     @RequestMapping(value="/dashboard/delete/{id}",method=RequestMethod.GET) 
      public String delete(@PathVariable("id") int id){ 
       categoryDAO.delete(id); 
       return "admin/dashboard"; 
      } 
     } 
+0

Вы можете оставить свой журнал ошибок – Akshay

+0

org.springframework.web.util.NestedServletException: обработка запроса не удалась; Вложенное исключение - org.hibernate.SessionException: сеанс уже закрыт первопричина org.hibernate.SessionException: сеанс уже закрыт –

ответ

0

На этой линии:

session.delete(getById(id)); 

Внутри GetByID, вы закрываете сессию и когда вы делаете удалить сеанс уже закрыт (в теории openSession создает новую сессию, но там уже один в текущей транзакции, поэтому я предполагаю, что он повторно использует родительский).

Решение было бы создать перегруженный метод GetByID, к которому вы можете передать уже существующую сессию и работу по этому поводу:

@Override 
public Category getById(int id, Session session) { 

    Category cat=(Category)session.get(Category.class, id); 

    return cat; 
} 

И в удалить вы бы:

@Override 
public void delete(int id) { 
     session = session.getSessionFactory().openSession(); 
     trans=session.beginTransaction(); 

     session.delete(getById(id, session)); 
     trans.commit(); 
     session.flush() ; 
     session.close(); 
} 
0

You можно использовать @Transactional аннотацию к методам, которые требуют сеанса

Как это:

@Override 
    @Transactional 
    public void delete(int id) { 
     session = session.getSessionFactory().openSession(); 
     trans=session.beginTransaction(); 

     session.delete(getById(id)); 
     trans.commit(); 
     session.flush() ; 
     session.close(); 

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