1

私は、休止状態でGenericDAOレイヤーを完全に理解して実装しようとしています。私はこの概念に不慣れで、少し読んだり勉強したりしています。GenericDAOレイヤーの実装例について多くの例を見つけましたが、これが最終的な結果です。

public class GenericDAOImpl<T, ID extends Serializable> implements GenericDAO<T, ID> {

    private static Logger log = Logger.getLogger(GenericDAOImpl.class.getName());


    private SessionFactory sessionFactory;


    @SuppressWarnings("unchecked")
    public T findById(long id, Class<T> objectClass) {
        log.info("Entered GenericDAOImpl findById(" + id +")");
        T result = (T) getSessionFactory().getCurrentSession().load(objectClass, id);
        if(result != null){
            Hibernate.initialize(result);
            return result;
        }else{ 
            return null;
        }
    }

    public boolean create(T newInstance) {
        log.info("Entered GenericDAOImpl create()");
        if(newInstance == null){
            return false;
        }
        getSessionFactory().getCurrentSession().saveOrUpdate(newInstance);
        return true;        
    }


    public boolean updpate(T updateInstance) {
        log.info("Entered GenericDAOImpl updpate()");
        if(updateInstance == null){
            return false;
        }
        getSessionFactory().getCurrentSession().update(updateInstance); 
        return true;
    }

    public boolean delete(T entity) {
        log.info("Entered GenericDAOImpl delete()");
        if(entity == null){
            return false;
        }
        getSessionFactory().getCurrentSession().delete(entity);
        return true;
    }

    @SuppressWarnings("unchecked")
    public List<T> findByExample(T exampleInstance, Class<T> objectClass){
        log.info("Entered GenericDAOImpl findByExample()");
        Criteria searchCriteria = getSessionFactory().getCurrentSession().createCriteria(objectClass);

        searchCriteria.add(Example.create(exampleInstance));

        return (List<T>)searchCriteria.list();          

    }

    public SessionFactory getSessionFactory() {
        return sessionFactory;
    }

    public void setSessionFactory(SessionFactory sessionFactory) {
        this.sessionFactory = sessionFactory;
    }       
}

これは理論的には機能するはずです(微調整が必​​要な場合があります)

私の質問は、ジェネリックを使用してserviceview layer階層化アーキテクチャのアプローチを「パススルー」できるかどうかです。トランザクションの処理などで、これを実行しても安全かどうかを知るのに十分な休止状態のトランザクションを完全には理解していません...

たとえば、サービスレイヤーの場合はこのようなものかもしれません

public class GenericServiceImpl<T, ID extends Serializable> implements GenericService<T, ID>{

    private GenericDAO<T, ID> genericDao;

    @Override
    public T findById(long id, Class<T> objectClass) {
        return this.getGenericDao().findById(id, objectClass);
    }

    @Override
    public boolean create(T newInstance) {
        return this.getGenericDao().create(newInstance);
    }

    @Override
    public boolean updpate(T updateInstance) {
        return this.getGenericDao().updpate(updateInstance);
    }

    @Override
    public boolean delete(T entity) {
        return this.getGenericDao().delete(entity);
    }

    @SuppressWarnings({ "unchecked", "rawtypes" })
    @Override
    public List findByExample(T exampleInstance, Class<T> objectClass) {
        return this.getGenericDao().findByExample(exampleInstance, objectClass);
    }


    public GenericDAO<T, ID> getGenericDao() {
        return genericDao;
    }

    public void setGenericDao(GenericDAO<T, ID> genericDao) {
        this.genericDao = genericDao;
    }


}

次に、一般的なビューレイヤーも実行できますか?

このアプローチが受け入れられるかどうか、またはこのアプローチに懸念があるかどうかをお知らせください。

よろしくお願いします!

4

3 に答える 3

3

あなたのサービスは、現状では、基礎となる DAO にすべてを委譲しているだけです。これが必要な場合もありますが、通常は「ビジネス ロジック」をサービス層に配置します。サービス レイヤーにロジックを配置すると、コントローラー レイヤーもかなり軽量に保つことができます。

サービスは、1 つ以上の DAO を使用して、必要なタスクを実行できます。AccountDao がある単純な銀行システムを考えてみましょう。

public class AccountDao implements GenericDao<Account, Long> {
  // your save, insert, delete, find, etc
}

それから私のサービスでは、「makePayment」か何かを入れます

@Service
public class AccountService {

   @Autowired
   private AccountDao dao;

   @Transactional
   public void makePayment(Long fromId, Long toId, double amount) {
      Account from = dao.find(fromId);
      from.withdrawl(amount);

      Account to = dao.find(toId);
      to.deposit(amount);

      dao.save(from);
      dao.save(to);
   }
}

サービス層でトランザクションを使用して、どの操作を同じトランザクションにする必要があるかをより詳細に制御できるようにします。

于 2012-08-23T20:32:09.640 に答える
1

参考までに、GenericDAO hibernate-generic-dao用の別のコード ライブラリが存在します。学習のために独自のコードを書くことはもちろん良いことですが、標準ライブラリやフレームワークのコードを読んで、そこで専門家が採用している標準を学習することも重要であると考えています。ですから、この図書館に行くことをお勧めします。

于 2014-09-01T13:13:45.123 に答える