자바

2013-06-08 1 views
0
에 거래 패턴을 캡슐화하는 방법

나는 등 같은 거래 패턴을 사용하여 내 데이터베이스 모델의 DAO를 작성하려고 해요자바

와 방법에서이 패턴을 캡슐화하는 좋은 방법을 무엇
Session session = null; 
    Transaction tx = null; 

    try{ 
     session = HibernateUtil.getSessionFactory().openSession(); 
     tx = session.beginTransaction(); 
     tx.setTimeout(5); 

     //doSomething(session); 

     tx.commit(); 


    }catch(RuntimeException e){ 
     try{ 
      tx.rollback(); 
     }catch(RuntimeException rbe){ 
      log.error("Couldn’t roll back transaction", rbe); 
     } 
     throw e; 
    }finally{ 
     if(session!=null){ 
      session.close(); 
     } 
    } 

 //doSomething(session); 

을 트랜잭션의 일부로 수행 할 인수로 사용 하시겠습니까? 때로는 쿼리를 실행하고, 때로는 session.saveOrUpdate 등에서 작업합니다. 필자는 많은 DAO를 작성하고이 패턴의 코드 복제로 나를 괴롭 히고 있습니다.

편집

session 운영 및 HQL (saveOrUpdate, delete는, 등) 그래서이 방법으로 전달해야 모든 그냥 쿼리입니다 사이에 직접 매핑이 있습니까?

통찰력에 감사드립니다.

답변

1
이 같은

뭔가 당신이있어 무엇을 수 있습니다 후

public void doSomething(MyQuery myQuery) { 
    ... 
    Transaction tx = null; 
    try { 
     ... 
     myQuery.execute(tx); 
     ... 
    } catch (...) { 
    } finally { 
    } 
} 

public class MyQuery { 
    public void execute(Transaction tx) { 
     // run queries on transaction 
    } 
} 

어느 새 MyQuery 인스턴스 또는 각 쿼리에 대한 새로운 MyQuery 서브 클래스를 생성하거나 응답에 대한

+0

감사를 실행하고자하는 쿼리의 설정 . 그것에 대해 생각한 후에'session.merge()','session.get()'등과 같은 세션 객체를 사용하여 수행되는 특정 액션이 있습니다. 이러한 함수와 쿼리를 효과적으로 매핑 할 수 있습니까? 이렇게하면 세션 종속성에서 모든 쿼리를 완전히 추출 할 수 있습니다. – Luke

+0

@ 루크 언제든지'execute' 시그니처를'execute (Session session, Transaction tx)'로 변경하고 "쿼리"가 세션 객체의 메소드를 실행하도록 할 수 있습니다. 트랜잭션과 세션 부분을 분리하여 보관하려면'execute (Transaction tx)'메소드와'MySessionState' 클래스와'execute (Session session)'메소드를 가진'MyQuery' 클래스를 사용하십시오 –

+0

고마워요! 나는 약간의 수정을했고, 나는 그것을 작동시켰다. C#과 같은 Task가 있었으면 좋겠다. – Luke