【问题标题】:DAO pattern - use Static or non Static methods?DAO 模式 - 使用静态或非静态方法?
【发布时间】:2013-08-01 13:19:40
【问题描述】:

我的应用程序使用的是 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);
    }
}

【问题讨论】:

    标签: design-patterns jpa methods static dao


    【解决方案1】:

    试试这个:为使用此 DAO 的代码编写单元测试。

    您的目标之一应该是快速通过的测试,并且不依赖外部资源(一个好的单元测试不应该要求存在实际的数据库。)因此,不要让您的测试调用真正的 DAO ,创建一个返回固定语言实体的模拟 DAO,并让您的测试代码使用模拟而不是真正的 DAO。这仍然有效吗?如果真实 DAO 具有这些方法的静态实现,您能否成功地将模拟 DAO 替换为真实 DAO?

    Statics make your code brittle.尽可能避免使用它们。

    【讨论】:

      猜你喜欢
      • 2011-02-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多