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 回答