Pessoal andei pesquisando por ae sobre daos genericos, e não gostei muito do que vi, ou nao entendi muito bem.
Bom o exemplo em questão é este que colo aqui:
Feito pelo ralphsilver neste tópico: http://www.guj.com.br/posts/list/140871.java
Minha idéia de dao generico é que ele seja generico e faça tudo pra mim, com qualquer tipo de object que eu envie pra ele.
Então nao poderiamos parar no BaseDaoImpl???
Porque é que eu preciso ir alem e ter mais uma interface e uma classe por ex: PessoaDao e PessoaDaoImpl??
Estou enferrujado e nao estou entendendo este conceito.
E outra imaginem eu com um CRUD de 100 Entities, neste caso vou precisar criar + 100 interfaces Dao e + 100 classes DaoImpl, fala sério 300 arquivos sendo que poderiam ser 100 e o BaseDaoImpl dar conta de fazer qualquer coisa com eles?? Na verdade este BaseDaoImpl ja consegue fazer tudo, o que nao entendo é porque ter mais uma interface e uma classe para cada entity.
Alguem tem uma outra versão de Daos genericos ai pra oferecer??
[code]import java.util.List;
public interface BaseDAO {
/*
* Ações possíveis feita com CRUD. Os métodos cujos parâmetros
* são do tipo java.util.List, são enviados em massa, ou seja,
* os dados são processados e armazenados e apenas no final o
* aplicativo lança o commit. Para grande massa de dados é mais
* viável pois o tempo de processo é muito maior quando abre apenas
* uma conexão e aplica apenas uma ação de persistencia
* */
public T remove(T object) throws Exception;
public T persist(T object) throws Exception;
public T update(T object) throws Exception;
public List<T> update(List<T> object) throws Exception;
public List<T> persist(List<T> list) throws Exception;
public List<T> remove(List<T> object) throws Exception;
/*
* Aqui se aplica todos os tipos de buscas possível para se fazer
* dentro de uma aplicação padrão.
* */
public List<T> findAll() throws Exception;
public T load(Object obj) throws Exception;
}[/code]
classe abstrata DAOImpl:
[code]import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityTransaction;
import br.edu.unianhanguera.plt.dao.BaseDAO;
public abstract class BaseDAOImpl implements BaseDAO {
protected EntityManager em = null;
@Override
public abstract List<T> findAll() throws Exception;
@Override
public abstract T load(Object obj) throws Exception;
@Override
public T persist(T object) throws Exception {
EntityTransaction transaction = em.getTransaction();
transaction.begin();
try{
em.persist(object);
transaction.commit();
return object;
}catch(Exception e){
transaction.rollback();
throw e;
}
}
@Override
public List<T> persist(List<T> list) throws Exception {
EntityTransaction transaction = em.getTransaction();
transaction.begin();
try{
for(T object:list)
em.persist(object);
transaction.commit();
return list;
}catch(Exception e){
transaction.rollback();
throw e;
}
}
@Override
public T remove(T object) throws Exception {
EntityTransaction transaction = em.getTransaction();
transaction.begin();
try{
em.remove(object);
transaction.commit();
return object;
}catch(Exception e){
transaction.rollback();
throw e;
}
}
@Override
public List<T> remove(List<T> list) throws Exception {
EntityTransaction transaction = em.getTransaction();
transaction.begin();
try{
for(T object:list)
em.remove(object);
transaction.commit();
return list;
}catch(Exception e){
transaction.rollback();
throw e;
}
}
@Override
public T update(T object) throws Exception {
EntityTransaction transaction = em.getTransaction();
transaction.begin();
try{
em.merge(object);
transaction.commit();
return object;
}catch(Exception e){
transaction.rollback();
throw e;
}
}
@Override
public List<T> update(List<T> list) throws Exception {
EntityTransaction transaction = em.getTransaction();
transaction.begin();
try{
for(T object:list)
em.merge(object);
transaction.commit();
return list;
}catch(Exception e){
transaction.rollback();
throw e;
}
}
}[/code]
quando eu preciso criar uma classe (Pessoa por exemplo) eu a interface DAO:
e o DAOImpl