2016-03-29 13 views
1

Sadece işlemin başlatılması gibi tekrarlayan kodları kaldırmak istiyorum ve blok yakalamayı deneyin ve Hibernate sınıflarıma yazdım.Hazırda bekletme araçlarını kullanarak nasıl optimize edilir?

Bu benim PersonDao sınıftır

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

Bu benim hazırda util sınıf

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

benim dao sınıfını optimize nasıl bir öneriniz olduğunu. Teşekkür

+0

Spring Framework'ü kullanacak mısınız? –

+0

Herhangi bir çerçeve kullanmıyorum –

+0

Bahar verisini JPA kullanarak boilerplate kodunun çoğundan sakınılabilirsin, bir göz atmanızı öneririm, [example] 'den birine link ver (http://www.springbyexample.org/ örnekler/yay veri JPA-repository.html) –

cevap

0

kendi özel uygulama geliştirmek istiyorsanız, size 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(); 
     } 
    }); 
} 

bir örneği Sen öteye gidip getCurrentSession() kullanmak ve salt okunur işlemlerini yapabilirsiniz kullanabilirsiniz istekleri oku.

Ancak en iyi yol, Bahar Çerçevesini kullanmaktır.

İlgili konular