2

spring、hibernate、maven、jpa、springMVC で大きなアプリケーションを開始します。今のところ私は30のクラスを持っています。(各クラスのインターフェイスには 60 個のクラスがあります) 2 つのパッケージがあります。(Dao とサービス) dao の場合、genericDao クラスを使用します。All Dao のクラス概要は次のとおりです。

>
package org.me.dao.jpageneric;

import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
 
import org.apache.log4j.Logger;
 
public abstract class GenericDAO<T, K> {
 
        @PersistenceContext(unitName="database")
        protected EntityManager em;
 
        protected Logger logger=Logger.getLogger(getClass());
 
        public abstract Query getByIdQuery(K id);
        public abstract Query getAllQuery();
 
        public T save(T saved) {
                if (saved == null) {
                  throw new IllegalArgumentException("L'argument de save() ne doit pas être nul.");
                }

                return (T) em.merge(saved);
        } // save()
 
        public void delete(T deleted) {
                if (deleted == null) {
                     throw new IllegalArgumentException("L'argument de delete() ne doit pas être nul.");
                }
                em.remove(deleted);
        } // delete().
 
        @SuppressWarnings("unchecked")
        public T get(K id) {
                if (id == null) {
                   throw new IllegalArgumentException("L'argument de get() ne doit pas être nul.");
                }
                Query query = getByIdQuery(id);
                return (T) query.getSingleResult();
        } 
        @SuppressWarnings("unchecked")
        public List<T> getAll() {
                logger.debug("Récupération de tous les objets");
                Query query = getAllQuery();
                return (List<T>) query.getResultList();
        } 

すべての Dao は、このクラスを拡張し、そのインターフェイスを実装する必要があります (そして、他の 30 のクラスに対してこれを作成する必要があります)。良い習慣になることを願っています。

その後、サービス クラスの抽象ジェネリック クラスがもう 1 つあります。

package org.me.service.generic;
 
import java.util.List;
 
public abstract class GenericService<T,K> {
 
        public abstract T create(T saved);
        public abstract void remove(T deleted);
        public abstract T findById(K id) ;
        public abstract List<T> findAll();
 
}

同様に、すべてのサービス クラスは、この汎用サービス クラスを拡張し、各クラスのインターフェイスを実装する必要があります。グッドプラクティスは再びですか?

もちろん、各クラス(パッケージdaoおよびservice)のインターフェースがあります。

別の質問: コントローラーを作成する必要がありますが、どうすればよいですか? クラスごとにコントローラーを作成するには(つまり、30個のコントローラーですか?)、ページhtmlおよびjspをどのように処理しますか?ありがとうございました。申し訳ありませんが、私の英語は下手です.:-)

4

2 に答える 2

2

Spring-data-jpa は GenericDAO を置き換えます。

crud サービスの spring-data-restを見ることができます。

または、crud 操作用の Web UI をスキャフォールディングする spring-roo を検討することをお勧めします。

于 2013-07-29T00:10:31.917 に答える
0

ソフトウェア プログラミングでよく知られているグッド プラクティスには、次のようなものがあります。

  • DRY (繰り返さないでください)。同じコードを何度もコピーしていることに気付いた場合、それはバグが発生するのを待っているだけです。特に、繰り返されるコードをリファクタリング (変更) するときはなおさらです。
  • 車輪を再発明しないでください。Spring Data JPA プロジェクトを見てください。使用できる一般的な DAO 機能が既にあります。

Spring MVC コントローラーの時点で、すべてのコントローラーをスーパークラス化する必要がある理由がわかりません。各コントローラー クラスに@Controller. コントローラーによって実行されるビジネス機能を Service クラスにカプセル化して、他の場所で再利用できるようにすることをお勧めします。

于 2013-07-28T23:49:25.657 に答える