如何使用休眠实用程序优化Dao? [英] How to optimize dao using hibernate util?

查看:62
本文介绍了如何使用休眠实用程序优化Dao?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我只想删除重复的代码,例如初始化事务,并尝试将catch块放入Hibernate util类中.

I just want to remove repetitive codes like initialization of transaction and try catch block and put it in my Hibernate util class.

这是我的PersonDao课

This is my PersonDao class

public class PersonDao {

    public List<Person> getAllPersons(){
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx = null;
        List<Person> persons = new ArrayList<>();
        try{
            tx = session.beginTransaction();
            Criteria cr = null;
                cr = session.createCriteria(Person.class);
                persons = cr.list();
        }catch (RuntimeException e) {
            e.printStackTrace();
        }finally {
            session.close();
        }
        return persons;
    }

    public Person getPersonById(int id) {
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx = null;
        Person person = null;
        try{
            tx = session.beginTransaction();
            String hql = "from Person where id = :id";
            Query query = session.createQuery(hql);
            query.setParameter("id",id);
            person = (Person) query.uniqueResult();
        }catch(RuntimeException e){
            e.printStackTrace();
        }finally{
            session.close();
        }
        return person;
    }

    public List<Person> getPersonByRole(String role){
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx = null;
        List<Person> persons = new ArrayList<>();
        try{
            tx = session.beginTransaction();
            String hql = "from Person where role = :role";
            Query query = session.createQuery(hql);
            query.setParameter("role",role);
            persons = query.list();
        }catch(RuntimeException e){
            e.printStackTrace();
        }finally{
            session.close();
        }
        return persons; 
    }

    public void addPerson(Person person){
        Transaction transaction = null;
        Session session = HibernateUtil.getSessionFactory().openSession();
        try{
            transaction = session.beginTransaction();
            session.save(person);
            session.getTransaction().commit();
        }catch(RuntimeException e){
            if(transaction != null){
                transaction.rollback();
            }
            e.printStackTrace();
        }finally{
            session.close();
        }
    }

    public void updatePerson(Person person){
        Transaction transaction = null;
        Session session = HibernateUtil.getSessionFactory().openSession();
        try{
            transaction = session.beginTransaction();
            session.update(person);
            session.getTransaction().commit();
        }catch(RuntimeException e){
            if(transaction != null){
                transaction.rollback();
            }
            e.printStackTrace();
        }finally{
            session.close();
        }
    }

    public void deletePerson(int id){
        Transaction transaction = null;
        Session session = HibernateUtil.getSessionFactory().openSession();
        try{
            transaction = session.beginTransaction();
            Person person = (Person)session.get(Person.class, id);
            session.delete(person);
            session.getTransaction().commit();
        }catch(RuntimeException e){
            if(transaction != null){
                transaction.rollback();
            }
            e.printStackTrace();
        }finally{
            session.close();
        }
    }
}

这是我的休眠实用程序类

This is my hibernate util class

public class HibernateUtil {
    private static final SessionFactory sessionFactory = buildSessionFactory();

    private static SessionFactory buildSessionFactory() {
        try {
            return 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;
    }
}

关于如何优化dao类的任何建议.谢谢

Any suggestions how can I optimize my dao class. Thanks

推荐答案

如果要开发自己的自定义实现,可以使用

If you want to develop your own custom implementation, you can use this pattern

  public static <T> T doInTransaction(IRequest<T> request) {
        Transaction txn = null;
        Session session = openSession();

        T result = null;

        try {
            txn = session.beginTransaction();
            result = request.doInTransaction(session);
            txn.commit();
        } catch (Throwable th) {
            InternalUtils.HibernateUtils.rollback(txn);
            throw InternalUtils.toRuntimeException(th);
        } finally {
            InternalUtils.HibernateUtils.close(session);
        }

        return result;
    }

您可以走得更远,将getCurrentSession()和只读事务用于读取请求.

You can go further and use getCurrentSession() and read-only transactions for read requests.

但是最好的方法是使用Spring框架.

But the best way is to use the Spring Framework.

这篇关于如何使用休眠实用程序优化Dao?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆