문제

childclass method 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() ;
    }
}
도움이 되었습니까?

해결책

이 경우 템플릿 패턴을 사용해야합니다.

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 템플릿 클래스를 자신의 롤링하는 대신 사용하는 것이 좋습니다. 그들은 시도하고 테스트했으며 중첩 트랜잭션 등으로 연결되는 문제를 해결했습니다.

다른 팁

다른 논리를 포함하는 런 가능성을 ExecuteTrans () 메소드에 전달하십시오.

그러나 템플릿 메소드 패턴이 실제로 여기서 필요한 것인지 확실하지 않습니다 (롤백을 어떻게 처리하고 있습니까?). 당신은 허용하는 스프링과 같은 프레임 워크를 조사하고 싶을 수도 있습니다. 선언적 거래.

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

  }
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top