0

私のアプリケーションは DAO パターンを使用しています。実装メソッドを「静的」にする必要がありますか?

私はこの具体的な実装について話している:

  • findByIdentifier(文字列識別子)

しかし、ジェネリック実装についても:

  • E getByID(K ID);
  • リストfindAll();
  • 保存 (E エンティティ);
  • 更新 (E エンティティ);
  • 削除 (E エンティティ);

アドバイスありがとう!

public interface DaoBase<K, E> {
    E getByID(K ID);
    List<E> findAll();
    void save(E entity);
    void update(E entity);
    void delete(E entity);
}



public interface DaoLanguage extends DaoBase<Long, LanguageEntity> {    
    LanguageEntity findByIdentifier(String identifier);
}

JPA を使用してすべてのエンティティ クラスを永続化しています。

public class JpaDaoLanguage extends JpaDaoBase<Long, LanguageEntity> implements DaoLanguage {
    public LanguageEntity findByIdentifier(String identifier) {
        LanguageEntity language = (LanguageEntity) entityManager.createQuery(
                "select lan from LanguageEntity as lan where lan.identifier = ?1")
                .setParameter(1, identifier)
                .getSingleResult();
        return language;
    }
}

汎用ベースの実装

public abstract class JpaDaoBase<K, E> implements DaoBase<K, E> {
    protected EntityManager entityManager;
    protected Class<E> entityClass;

    @SuppressWarnings("unchecked")
    public JpaDaoBase() {
        ParameterizedType genericSuperclass = (ParameterizedType) getClass()
                .getGenericSuperclass();
        this.entityClass = (Class<E>) genericSuperclass
                .getActualTypeArguments()[1];

        EntityManagerFactory factory = Persistence
                .createEntityManagerFactory("CyberLabPersistenceUnit");
        entityManager = factory.createEntityManager();
    }

    @Override
    public E getByID(K ID) {
        return entityManager.find(entityClass, ID);
    }

    @SuppressWarnings("unchecked")
    @Override
    public List<E> findAll() {
        Query q = entityManager.createQuery("SELECT e FROM "
                + entityClass.getName() + " e ");
        return (List<E>) q.getResultList();
    }

    @Override
    public void save(E entity) {
        entityManager.persist(entity);
    }

    @Override
    public void update(E entity) {
        entityManager.merge(entity);
    }

    @Override
    public void delete(E entity) {
        entityManager.remove(entity);
    }
}
4

1 に答える 1

1

これを試してください: この DAO を使用するコードの単体テストを作成します。

目標の 1 つは、非常に迅速に合格し、外部リソースに依存しないテストにする必要があります (優れた単体テストでは、実際のデータベースが存在する必要はありません)。そのため、テストで実際の DAO を呼び出す代わりに、固定言語エンティティを返す DAO をモックし、テスト コードで実際の DAO の代わりにモックを使用します。それはまだ機能しますか?実際の DAO にこれらのメソッドの静的実装がある場合、実際の DAO をモック DAO に置き換えることができますか?

静的はコードを脆くします。できる限り避けてください。

于 2013-08-01T14:58:37.460 に答える