Вопрос

Могу ли я узнать, как создать дочерний класс, если мой метод дочернего класса getInfoFromDB() и saveToDB() должен выполнять другую логику?

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

При этом я бы посоветовал использовать классы шаблонов Spring JDBC, а не создавать свои собственные - они были опробованы и протестированы и решили проблемы, с которыми вы можете столкнуться при использовании вложенных транзакций и т. д.

Другие советы

Передайте Runnable, содержащий другую логику, в метод ExecuteTrans().

Однако я не уверен, что шаблон метода шаблона действительно то, что вам здесь нужно (и как он обрабатывает откаты?).Возможно, вы захотите изучить такую ​​структуру, как Spring, которая позволяет декларативные транзакции.

Ник, «Техас», который я собираюсь использовать, выглядит ниже.судя по коду, лучшая практика, жизненный цикл в порядке, поскольку он вызывается как 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