2013-08-01 2 views
0

Мое приложение использует шаблон DAO. Должен ли я использовать методы внедрения «статические» или нет?DAO pattern - использовать статические или не статические методы?

Я говорю об этом конкретном осуществлении:

  • findByIdentifier (идентификатор строки)

Но и о родовых реализациях:

  • E GetByID (K ID);
  • Список findAll();
  • сохранить (объект E);
  • обновление (объект E);
  • delete (E entity);

Спасибо за совет!

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; 
    } 
} 

Generic Base реализация внешнего

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); 
    } 
} 

ответ

1

Попробуйте это: написать модульный тест для кода, вы должны что использует этот DAO.

Одна из ваших целей - это тесты, которые проходят очень быстро и не имеют зависимости от внешних ресурсов (для хорошего модульного теста не требуется наличие реальной базы данных). Поэтому вместо того, чтобы ваш тестовый вызов был реальным DAO, создайте макет DAO, который возвращает фиксированный язык, и ваш тестовый код использует макет вместо реального DAO. Это еще работает? Можете ли вы успешно заменить ваш макет DAO для реального DAO, если реальный DAO имеет статические реализации этих методов?

Statics make your code brittle. Избегайте их, когда можете.

Смежные вопросы