@P_Alexander
First head

Правильно ли я работаю с сессиями и транзакциями Hibernate?

Добрый день, пишу не большое приложения с использованием Hibernate + servlet, все работает и так как я на пути изучения Hibernate возник вопрос Правильно ли я обрабатываю Сессию и транзакции?
Немного о структуре кода
Есть класс HibernateUtil где билдится Сессионфактори.
Есть Абстрактый класс где объявлены CRUD операции от него наследуется класс DAOUser который реализовывает эти методы + есть интерфейс в котором есть методы (ну типо заточены для работы только с классом USER) и класс DAOUser их реализовывает.
B в классе DAOUser я реализовываю методы CRUD, так вот подскажите правильно ли я обрабатываю их и если есть ошибки по структуре или любые другие буду рад выслушать как лучше или правильнее сделать.Если есть по этому поводу статьи , это тоже приветсвуется!
Я читал что каждая операция должна обрабатываться только в отдельной сессии, поэтому сделал так, но тут же есть вопрос Не реализовал ли я таким образом анти-шаблон?
Класс DAOUser:
public class DaoUser extends AbstractDAO<UserE, Integer> implements DAOUserInterface{
    private SessionUtil sessionUtil;

    public DaoUser(){
    }

    @Override
    public List<UserE> getAll() {
        List<UserE> users = new ArrayList<>();
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx = session.beginTransaction();
        try {
            Query query = session.createSQLQuery("SELECT * FROM test.users").addEntity(UserE.class);
            users = query.list();
            tx.commit();
        }catch (HibernateException e){
            tx.rollback();
            e.printStackTrace();
            System.out.println("Error in method getAll " + e.getMessage());
            return users;
        }finally {
            System.out.println("Sesion close getAll - in class USER");
            session.close();
        }
        return users;
    }

    @Override
    public UserE update(UserE entity) {
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx = session.beginTransaction();
        try{
            session.update(entity);
            tx.commit();
        }catch(HibernateException e){
            tx.rollback();
            e.printStackTrace();
            System.out.println("Error in method update " + e.getMessage());
            return null;
        }finally {
            System.out.println("Sesion close update - in class USER");
            session.close();
        }
        return entity;
    }

    @Override
    public UserE getEntityById(Integer id) {
        UserE userE = new UserE();
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx = session.beginTransaction();
        try {
//            tx = session.beginTransaction();
            userE = session.load(UserE.class, id);
            if (userE != null){
                System.out.println("it is a getEntityById " + userE.toString());
            }
            tx.commit();
        }catch (HibernateException e){
            tx.rollback();
            e.printStackTrace();
            System.out.println("Error in method getEntityById " + e.getMessage());
        }finally {
            System.out.println("Sesion close getEntityById - in class USER");
            session.close();
        }
        return userE;
    }

    @Override
    public boolean delete(Integer id) {
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx = session.beginTransaction();
        try{
            UserE user = session.load(UserE.class, id);
            if(user != null){
                session.delete(user);
            }
            tx.commit();
        }catch(HibernateException e){
            tx.rollback();
            e.printStackTrace();
            System.out.println("Error in method delete " + e.getMessage());
            return false;
        }finally {
            System.out.println("Sesion close delete - in class USER");
            session.close();
        }
        return true;
    }

    @Override
    public boolean create(UserE entity) {
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx = session.beginTransaction();
        try {
            session.save(entity);
//            session.flush();
            tx.commit();
        }catch (HibernateException e){
            tx.rollback();
            e.printStackTrace();
            System.out.println("Error in method create " + e.getMessage());
            return false;
        }finally {
            System.out.println("Sesion close create - in class USER");
            session.close();
        }
        return true;
    }

    @Override
    public UserE findUserByNickName(String nickname) {
        UserE userE = new UserE();
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx = session.beginTransaction();
        try {
            userE = (UserE) session.createCriteria(UserE.class).add(Restrictions.eq("nickname", nickname)).uniqueResult();
            if(userE != null) {
                System.out.println(" IT IS FROM findUserByNickName = " +userE.toString());
            }
            tx.commit();
        }catch (HibernateException e){
            tx.rollback();
            e.printStackTrace();
            System.out.println("Error in method findUserByNickName " + e.getMessage());
        }finally {
            System.out.println("Sesion close findUserByNickName - in class USER");
            session.close();
        }

        return userE;
    }

    @Override
    public UserE findConfirmKey(String key) {
        UserE userE = new UserE();
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx = session.beginTransaction();
        try {
            userE = (UserE) session.createCriteria(UserE.class).add(Restrictions.eq("key", key)).uniqueResult();
            if(userE != null) {
                System.out.println(userE.toString());
            }
            tx.commit();
        }catch (HibernateException e){
            tx.rollback();
            e.printStackTrace();
            System.out.println("Error in method confirmKey " + e.getMessage());
        }finally {
            System.out.println("Sesion close findConfirmKey - in class USER");
            session.close();
        }

        return userE;
    }
}
  • Вопрос задан
  • 201 просмотр
Пригласить эксперта
Ответы на вопрос 1
leahch
@leahch
3D специалист. Dолго, Dорого, Dерьмово.
Ух, сколько кода... Рекомендую сесси. хибернейта класть в servlet-filter, здесь ее открывать, и тут же ее закрывать.
Стек вызовов у вас будет следующий
filter ->
   -> servler
       hibenate
   <- servlet
filter

Примерно так - https://gist.github.com/mccxj/146009
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы