DAO接口/实现拆分层次结构和约定

时间:2012-04-18 03:32:27

标签: java dao

在尝试实现基础通用CRUD DAO时,我遇到了一些似乎有点反模式的内容

GenericDao

public interface GenericDao<T, PK extends Serializable> {

  T findOne(final PK id);

  List<T> findAll();

  PK create(final T entity);

  void update(final T entity);

  void delete(final T entity);

  void deleteById(final PK id);

}

将GenericDaoHibernateImpl

public abstract class GenericDaoHibernateImpl<T, PK extends Serializable> implements    GenericDao<T, PK> {

  @Autowired
  private SessionFactory sessionFactory;
  private Class<T> clazz;

  public GenericDaoHibernateImpl(Class<T> clazzToSet) {
      this.clazz = clazzToSet;
  }

  protected final Session getCurrentSession() {
    return sessionFactory.getCurrentSession();
  }

  @Override
  public T findOne(PK id) {
    return (T) getCurrentSession().get(clazz, id);
  }

  @Override
  public List<T> findAll() {
    return getCurrentSession().createQuery("from " + clazz.getName()).list();
  }

  @Override
  public PK create(T entity) {
    return (PK) getCurrentSession().save(entity);
  }

  @Override
  public void update(T entity) {
    getCurrentSession().update(entity);
  }

  @Override
  public void delete(T entity) {
    getCurrentSession().delete(entity);
  }

  @Override
  public void deleteById(PK id) {
    final T entity = findOne(id);
    delete(entity);
  }
}

CustomerDao

public interface CustomerDao extends GenericDao<Customer, Long> {

  public Customer findByUsername(String username);

}

CustomerDaoHibernateImpl

public class CustomerDaoHibernateImpl extends GenericDaoHibernateImpl<Customer, Long> implements CustomerDao {

  public CustomerDaoHibernateImpl() {
    super(Customer.class);
  }

  public Customer findByUsername(String username);
    Criteria criteria =  getCurrentSession().createCriteria(Customer.class);
    criteria.add(Restrictions.eq("username", username));
    return criteria.list();
  }

}

我所提到的问题是,在我们特定领域的DAO实现中,就像我们两次满足/实现GenericDao一样。一旦进入GenericDaoHibernateImpl,然后再次在我们的域DAO接口,即CustomerDao。这里我们必须在声明中指定使用Customer和Long。 然后我们实现CustomerDaoHibernateImpl,并且我们必须再次声明Customer和Long。

我做错了什么,因为它似乎不是正确的方法。

由于

2 个答案:

答案 0 :(得分:0)

答案 1 :(得分:0)

我从未将它看作是扩展/实现共同祖先的接口和抽象类的反模式。对我来说,客户界面说它需要通用dao中定义的所有操作。抽象类碰巧说它实现了泛型dao。然后当你到达你的客户时,你指示你实现了客户界面,然后选择通过扩展抽象类来实现它。如果要么不想扩展/实现泛型dao而另一个想要扩展/实现泛型dao,这允许抽象类和客户接口单独增长或改变。希望有意义

更新:我看到我并没有完全回答你关于havIng的泛型问题要冗余地指定,但希望我的答案给出了具有相同祖先界面的接口和抽象类的可信度