2009-08-14 4 views
3

내 childClass 메서드 getInfoFromDB() 및 saveToDB()가 다른 논리를 수행해야하는 경우 childClass를 만드는 방법을 알고 있을까요?템플릿 메서드 패턴

public abstract class BaseClass { 
    public abstract Object doTransaction(); 
    public Object executeTrans() { 
      //do something 
      tx.begin();    
      this.doTransaction(); 
      tx.commit(); 

    } 
} 
public childClass extends BaseClass{ 
    @Override 
    public Object doTransaction(){ 
     //overide to get something from database so can only be used for getInfoFromDB() and not for saveToDB() 
     return something; 
    } 
    public List<String> getInfoFromDB(){ 
     super.executeTrans(); 
    } 
    public void saveToDB(){ 
     super.executeTrans() ; 
    } 
} 

답변

4

당신이 경우 템플릿 패턴을 사용한다, 이런 일이 :

public abstract class BaseClass 
{  
    public Object executeTrans(Template template) 
    { 
    tx.begin();    
    template.doTransaction(); 
    tx.commit();  
    } 
} 

public interface Template 
{ 
    public void doTransaction(); 
} 

public childClass extends BaseClass 
{ 
    public List<String> getInfoFromDB() 
    { 
    executeTrans(
     new Template() 
     { 
     public void doTransaction() 
     { 
      ...do get info from DB here. 
     } 
     } 
    ); 
    } 

    public void saveToDB() 
    { 
    executeTrans(
     new Template() 
     { 
     public void doTransaction() 
     { 
      ...do save to DB here. 
     } 
     } 
    ); 
    } 
} 

그렇게 말하고, 나는 봄 JDBC 템플릿 클래스를 사용하기보다는 자신의 압연 좋을 걸 - 그들은했습니다 시도되고 테스트되었고 중첩 된 트랜잭션 등에서 실행할 문제를 해결했습니다.

+0

pls는이 날 수정) 라이프 사이클 괜찮이다. childClass가 BaseClass를 확장하도록함으로써; saveToDB() 및 getInfoFromDB()에 대한 executeTrans() 메서드는 동일한 executeTrans()의 tx.begin 및 tx.close()를 호출합니다. 괜찮을까요? 아니면 별도의 새로운 인스턴트 여야합니까? – cometta

+0

나는 "템플릿"유형이 무엇인지 알 수 있습니까? – cometta

+0

이 템플릿 클래스입니다. -> class Template() {public void doTransaction() {}; }? – cometta

1

다른 로직을 포함하는 Runnable을 executeTrans() 메소드에 전달하십시오.

그러나 템플릿 메서드 패턴이 실제로 여기에 필요하고 롤백을 처리하는 방법이 확실하지 않습니다. declarative transactions을 허용하는 Spring과 같은 프레임 워크를 살펴볼 수 있습니다.

1

Nick, "tx"는 다음과 같이 사용합니다. 이 두 savetodb()와 getinfofromdb (호출 이후 코드, 모범 사례로 판단, 내가 틀렸다면

public abstract class BaseClass 
{  
    public Object executeTrans(Template template) 
    { 
     // PersistenceManager pm = ...; 
     Transaction tx = pm.currentTransaction(); 
     try { 
      tx.begin(); 
      template.doTransaction(); 
      tx.commit(); 
     } finally { 
      if (tx.isActive()) { 
       tx.rollback(); 
      } 
     } 

    } 
} 
+0

나는 JDO에 대해 많이 모른다. (나는 이것이 당신이 사용하고있는 것이라고 생각한다.) finally 블록을 제외하고는 옳았다. 아마 예외가 발생하면 롤백을 할 것이다. –

관련 문제