Generic Data Access Objects

Boa tarde galera
Estou com umas duvidas em um artigo no site do hibernate (http://www.hibernate.org/328.html) sobre a implementacao de DAOs no hibernate.
Algumas pessoas ainda discutem que DAO+Hibernate é perda de tempo, mesmo que a propria mantenedora da framework indique o uso de DAO, e talvez seja mesmo perda de tempo em certas ocasioes

O ponto que gostaria de discutir é:
Quando devo usar DAO + Hibernate
Existe uma solução melhor que o DAO
Existe uma forma adequada ou especifica para implementar DAO+Hibernate
Como funciona o DAO que esta no artigo do hibernate

Tive umas duvidas no DAO do artigo pois o que é isso?

public interface ItemDAO extends GenericDAO<Item, Long> {

    public static final String QUERY_MAXBID = "ItemDAO.QUERY_MAXBID";
    public static final String QUERY_MINBID = "ItemDAO.QUERY_MINBID";

    Bid getMaxBid(Long itemId);
    Bid getMinBid(Long itemId);

}
private Class<T> persistentClass;
    private Session session;

    public GenericHibernateDAO() {
        this.persistentClass = (Class<T>) ((ParameterizedType) getClass()
                                .getGenericSuperclass()).getActualTypeArguments()[0];
    }
newBid = item.placeBid(userDAO.findById(userId, false),
                            bidAmount,
                            currentMaxBid,
                            currentMinBid);
public static final DAOFactory EJB3_PERSISTENCE =
            new org.hibernate.ce.auction.dao.ejb3.EJB3DAOFactory();

    public static final DAOFactory HIBERNATE =
            new org.hibernate.ce.auction.dao.hibernate.HibernateDAOFactory();