2016-03-29 8 views
1

トランザクションの初期化のような反復コードを削除し、catchブロックを試してHibernate utilクラスに入れたいだけです。hibernate utilを使ってDAOを最適化するには?

これはこれは私が私のDAOクラスを最適化する方法任意の提案

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; 
    } 
} 

私の休止状態utilのクラスで私のPersonDaoクラス

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(); 
     } 
    } 
} 

です。おかげ

+0

Spring Frameworkを使用しますか? –

+0

フレームワークを使用していません –

+0

スプリングデータJPAを使用して定型コードをたくさん避けることができます。見てみることを強くお勧めします。[example](http://www.springbyexample.org/ examples/spring-data-jpa-repository.html) –

答えて

0

独自のカスタム実装を開発する場合、あなたは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; 
    } 

use

public List<T> list() { 
    return HibernateSessionFactory.doInTransaction(new IRequest<List<T>>() { 
     @Override 
     public List<T> doInTransaction(Session session) { 
      return tuneCriteriaForList(createCriteria(session)).list(); 
     } 
    }); 
} 

の例あなたは遠くに行くとgetCurrentSession()を使用すると、読み取り専用のために取引をすることができますを使用することができます読み取り要求。

しかし、最も良い方法は、Spring Frameworkを使用することです。

関連する問題