Bom dia,
Estou em dúvida de como utilizar um Generic Dao no Vraptor, pois criei as seguintes classes;
Interface GenericDao
public interface GenericDao<E,K> {
void add(E entity) ;
void saveOrUpdate(E entity) ;
void update(E entity) ;
void remove(E entity);
E find(K key);
List<E> getAll() ;
}
Implementação do GenericDao
public abstract class GenericDaoImpl<E, K extends Serializable> implements GenericDao<E, K> {
protected final Session session;
protected final Class<E> clazz;
protected Class<? extends E> daoType;
private Transaction tx;
@SuppressWarnings("unchecked")
protected GenericDaoImpl(Session session) {
this.session = session;
this.clazz = (Class<E>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
Type t = getClass().getGenericSuperclass();
ParameterizedType pt = (ParameterizedType) t;
daoType = (Class) pt.getActualTypeArguments()[0];
}
@Override
public void add(E entity) {
this.tx = this.session.beginTransaction();
this.session.persist(entity);
this.session.flush();
this.tx.commit();
}
@Override
public void saveOrUpdate(E entity) {
this.tx = this.session.beginTransaction();
this.session.merge(entity);
this.session.flush();
this.tx.commit();
}
@Override
public void update(E entity) {
this.tx = this.session.beginTransaction();
this.session.merge(entity);
this.session.flush();
this.tx.commit();
}
@Override
public void remove(E entity) {
this.tx = this.session.beginTransaction();
this.session.delete(entity);
this.tx.commit();
}
@Override
public E find(K key) {
return null;
}
@Override
public List<E> getAll() {
return null;
}
}
Para cada modelo vou criar uma interface como a seguinte;
Interface PacoteDao
public interface IPacoteDao extends GenericDao<Pacote, Integer>{
void alterarSituacao(Long pacoteId, Pacote.PacoteSituacao situacao);
void removerAgendamento(Agendamento agendamento, Boolean remover, HistoricoAcesso log);
Long contarAgendamentosPendentes(Unidade unidade, LocalDate startDate, LocalDate endDate);
Long contarPorSituacao(Unidade unidade, Pacote.PacoteSituacao situacao);
Long contarFinalizamNoPeriodo(Unidade unidade, LocalDate startDate, LocalDate endDate);
List<PacoteView> listar(Unidade unidade, Boolean novos, Boolean concluidos,
Boolean cancelados, LocalDate periodoInicio, LocalDate periodoFim);
}
Implementação PacoteDao
public class PacoteDaoImpl extends GenericDaoImpl<Pacote, Integer>
implements IPacoteDao {
protected PacoteDaoImpl(Session session) {
super(session);
}
@Override
public void alterarSituacao(Long pacoteId, Pacote.PacoteSituacao situacao) {}
@Override
public void removerAgendamento(Agendamento agendamento, Boolean remover, HistoricoAcesso log) {}
@Override
public Long contarAgendamentosPendentes(Unidade unidade, LocalDate startDate, LocalDate endDate) {}
@Override
public Long contarPorSituacao(Unidade unidade, Pacote.PacoteSituacao situacao) {}
@Override
public Long contarFinalizamNoPeriodo(Unidade unidade, LocalDate startDate, LocalDate endDate) {}
@Override
public List<PacoteView> listar(Unidade unidade, Boolean novos, Boolean concluidos, Boolean cancelados, LocalDate periodoInicio, LocalDate periodoFim) {}
}
Quando eu incluo a anotação @Component na classe PacoteDaoImpl ocorre um erro ao rodar o projeto. Como é a primeira vez que implemento o uso de GenericDao no Vraptor, estou com dificuldades para implementá-lo.
A minha idéia é dividir os escopos; Controller --> Service --> Dao.
Conto com a ajuda!