Question

Puis-je savoir comment créer ChildClass si ma méthode ChildClass getInfoFromDB () et saveToDB () besoin de faire une logique différente?

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() ;
    }
}
Était-ce utile?

La solution

Vous devez utiliser le modèle de modèle dans ce cas, quelque chose comme ceci:

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

En disant cela, je vous conseille l'utilisation des classes de modèle Spring JDBC plutôt que de rouler vos propres -. Ils ont été essayé et testé et ont résolu les problèmes que vous tomberez sur des transactions imbriquées etc

Autres conseils

passer un Runnable contenant la logique différente de la méthode executeTrans ().

Cependant, je ne suis pas sûr que le modèle de la méthode de modèle est vraiment ce que vous avez besoin ici (et comment est-il manipulez rollbacks?). Vous pouvez regarder dans un cadre tel que le printemps qui permet transactions déclaratives .

Nick,    le « tx » que je vais utiliser ressembler ci-dessous. à en juger par le code, les meilleures pratiques, est le cycle de vie est ok car il est appelé par les deux savetodb () et 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();
            }
        }

  }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top