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

3 に答える 3

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

そうは言っても、Spring JDBC テンプレート クラスを使用することをお勧めします。独自のクラスを展開するのではなく、それらは試行およびテストされており、ネストされたトランザクションなどで発生する問題を解決しています。

于 2009-08-14T08:37:41.567 に答える
1

別のロジックを含む Runnable を executeTrans() メソッドに渡します。

ただし、テンプレート メソッド パターンが本当にここで必要なものであるかどうかはわかりません (また、ロールバックをどのように処理していますか?)。宣言型トランザクションを許可する Spring などのフレームワークを検討することをお勧めします。

于 2009-08-14T08:41:31.887 に答える
1

ニック、私が使用する「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();
            }
        }

  }
}
于 2009-08-14T09:08:57.387 に答える