Vamos implementar a persistência de um usuário no BD, utilizando uma camada a mais de abstração, a REPOSITORY.
Precisamos de uma interface que forneça assinatura de métodos para persistência:
public interface RepositorioInterface<T> {
public void adicionar(T objeto);
public void remover(T objeto);
}
Precisamos também de outra interface que forneça assinatura de métodos para a “fábrica” de RepositorioInterface:
public interface RepositorioFactoryInterface {
public void beginTransaction();
public void commit();
public UsuarioRepositorioInterface getUsuarioRepositorio();
public QualquerCoisaRepositorioInterface getQualquerCoisaRepositorio();
}
Até agora, o que temos são métodos genéricos para implementação (métodos comuns a qualquer entidade e DaoFactory).
Mas como queremos persistir um usuário, é interessante criar uma interface de repositorio comum para usuario, que contém assinatura de métodos para persistência “típica” de usuarios no sistema:
public interface UsuarioRepositorioInterface extends RepositorioInterface<Usuario> {
public List<Usuario> getUsuariosDaFaculdade(Faculdade faculdade);
}
Agora, para realmente persistir, no caso com JPA e Hibernate, criamos um Dao<T> genérico que implementa os métodos da interface RepositorioInterface<T>, que recebe no construtor um EntityManager:
public class Dao<T> implements RepositorioInterface<T> {
protected final EntityManager em;
private Classe classe;
public Dao(EntityManager em, Class classe) {
this.em = em;
this.classe = classe;
}
public T atualizar(T t) {
return this.em.merge(t);
}
public void remover(T t) {
this.em.remove(t);
}
//get, set
}
O DaoFactory, que implementa os métodos da interface RepositorioFactoryInterface:
public class DaoFactory implements RepositorioFactoryInterface {
protected final EntityManager em;
private EntityTransaction transaction;
public DaoFactory() {
em = JPAUtil.getEntityManager();
}
public void beginTransaction() {
this.transaction = em.getTransaction();
this.transaction.begin();
}
public void commit() {
this.transaction.commit();
this.transaction = null;
}
public UsuarioRepositorioInterface getUsuarioRepositorio() {
return new UsuarioRepositorioDao(em, classe);
}
}
E por fim, o UsuarioRepositorioDao, que herda Dao<Usuario> e implementa os métodos da interface UsuarioRepositorioInterface:
public class UsuarioRepositorioDao extends Dao<Usuario> implements UsuarioRepositorioInterface {
public UsuarioRepositorioDao(EntityManager em, Class classe) {
super(em, classe);
}
public List<Usuario> getUsuariosDaFaculdade(Faculdade faculdade, int inicio, int quantidade) {
Query q = getQuery("SELECT u FROM Usuario u WHERE u.faculdade = :faculdade order by u.avatar desc, u.ultimoLogin desc");
q.setHint("org.hibernate.cacheable", true);
q.setParameter("faculdade", faculdade);
q.setFirstResult(inicio);
q.setMaxResults(quantidade);
return getQueryResultList(q);
}
public List<Usuario> getUsuariosDaFaculdade(Faculdade faculdade) {
return getUsuariosDaFaculdade(faculdade, 0, 6);
}
}
Esta foi uma forma simples de implementar o REPOSITORY. A vantagem aí está que se eu tiver que alterar minha forma de persistência, altero apenas os Dao´s, tendo que apenas implementar os métodos impostos pelas interfaces REPOSITORY.
Espero ter ajudado.
[]´s