2009-08-14 7 views
3

私のchildClassメソッドのgetInfoFromDB()とsaveToDB()が別のロジックを行う必要がある場合、childClassの作成方法は分かりますか?彼らがきた - 私はむしろあなた自身の圧延よりも、春のJDBCテンプレートクラスを使用してお勧めする、ことを言っテンプレートメソッドパターン

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

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

あなたは、このような何かを、この場合のテンプレートパターンを使用する必要があります試してテストし、ネストされたトランザクションなどで実行する問題を解決しました。

+0

pls私が間違っていると私を修正します。 childClassにBaseClassを継承させることにより、 saveToDB()とgetInfoFromDB()のexecuteTrans()メソッドは同じexecuteTrans()のtx.beginとtx.close()を呼び出します。これは大丈夫でしょうか?別の新しいインスタントにする必要がありますか? – cometta

+0

私はそこに置かれている "テンプレート"タイプは何ですか? – cometta

+0

は、このようなテンプレートクラスです - > class Template(){public void doTransaction(){}; }? – cometta

1

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

しかし、テンプレートメソッドパターンが実際に必要なものであるかどうか(ロールバックをどのように処理するのか)はわかりません。 declarative transactionsを許可するSpringのようなフレームワークを調べたいと思うかもしれません。

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

    } 
} 
+0

私はJDOについてよく分かりませんが(私はそれを使用していると思いますが)、finallyブロックを除いて正しく表示されます。例外が発生した場合はロールバックを実行します。 –

関連する問題