14

私はいくつかのチュートリアルを読んでいて、ほとんどの MVC 実装が

以下に基づいています。

1) "IUserDao" などの dao インターフェイス

2) そのインターフェースの dao impl - "mySimpleUserDaoImpl"

3) 永続化のためのサービス インターフェイス: "IUserService"

4) および impl - "UserServiceImpl"

これはベストプラクティスですか?私がこの質問をする理由は、getXById()、deleteX(x)、createX(x) メソッドを備えた 30 のサービスが多かれ少なかれ同じことを行うのは冗長に思えるからです。

私はSpring 3とHibernate 4を使用していることを考慮してください。コードでキーボードを叩き始める前に、この質問をすることにしました

ありがとう。

4

4 に答える 4

10

開発を始めたばかりの場合は、Spring JPAを調べてください。サービスは、1 対多のリポジトリ (DAO) である必要があります。しかし、その定型コードをすべて手作業で作成することももうありません。Spring JPA は、基本的な CRUD と検索機能、およびページネーションを排除します。

これは、Spring、JPA、Hibernate のすべての構成をウォークスルーし、Spring Data JPA で終了するビデオで、削除されたボイラープレート コードのすべてを示しています。

Spring Data JPA を使用するには、リポジトリ インターフェイスは次のようになります。

package com.mysampleapp.repository;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import com.wcfgroup.model.Employee;

@Repository("employeeRepository")
public interface EmployeeRepository extends JpaRepository<Employee, Long> {
    Employee findBySsn(String ssn);
}

次に、Spring Data JPA を使用するための XML 構成:

<jpa:repositories base-package="com.mysampleapp.repository"/>

すべての定型コードが処理されるようになりました。find メソッドと基本的な CRUD 関数を使用して基本的なリポジトリ クラスを作成する必要はなくなりました。インターフェイスは多くのJpaRepository優れた機能を提供し、実装のために何もする必要はありません。

于 2013-05-14T16:55:02.017 に答える
4

モデルごとに dao、daoImpl、service、serviceImpl が必要です。

  • ユーザーダオ
  • UserDaoImpl
  • ユーザーサービス
  • UserServiceImpl

次のように、汎用クラス EntityDaoImpl とインターフェイス EntityDao を使用できます。

エンティティダオ:

public interface EntityDao<E> {

void persist(E e) throws Exception;

void remove(Object id) throws Exception;

E findById(Object id) throws Exception;
}

EntityDaoImpl:

public class EntityDaoImpl<E>  implements EntityDao<E> {

@PersistenceContext(unitName="UnitPersistenceName")
protected EntityManager entityManager;

protected E instance;
private Class<E> entityClass;

@Transactional
public void persist(E e) throws HibernateException{     
    getEntityManager().persist(e);
}
    @Transactional
public void remove(Object id) throws Exception{     
    getEntityManager().remove((E)getEntityManager().find(getEntityClass(), id));
}

public E findById(Object id) throws Exception {     
    return (E)getEntityManager().find(getEntityClass(), id);    
}
    public EntityManager getEntityManager() {
    return entityManager;
}
public void setEntityManager(EntityManager entityManager) throws Exception{
    this.entityManager = entityManager;
}

    public Class<E> getEntityClass() throws Exception{      
   if (entityClass == null) {
            Type type = getClass().getGenericSuperclass();
          if (type instanceof  ParameterizedType) 
          {
              ParameterizedType paramType = (ParameterizedType) type;
              if (paramType.getActualTypeArguments().length == 2) {
                    if (paramType.getActualTypeArguments()[1] instanceof  TypeVariable) {
                       throw new IllegalArgumentException(
                          "Can't find class using reflection");
                   }
                    else {
                       entityClass = (Class<E>) paramType.getActualTypeArguments()[1];
                  }
               } else {
                  entityClass = (Class<E>) paramType.getActualTypeArguments()[0];
                }
           } else {
              throw new Exception("Can't find class using reflection");
          }
        }
       return entityClass;
   }
}

そして、次のように使用できます。

public interface UserDao extends EntityDao<User> {

}

public class UserDaoImpl extends EntityDaoImpl<User> implements UserDao{

}
于 2013-05-14T17:29:34.603 に答える
1

いいえ、30 個のサービス レイヤーまたは 30 個の dao レイヤーを用意する必要はありません。レイヤーはエンティティではなく、ビジネス機能を考慮して指定する必要があります。特定の機能に関連する 5 つまたは 6 つのエンティティが存在する可能性があり、それらは 1 つのレイヤーにある必要があります。ただし、必要な場合は、これらの冗長レイヤーに getXById()、deleteX(x)、createX(x) を含める必要があります。

于 2013-05-14T16:23:21.547 に答える