Seguinte galera, depois de revirar vários tópicos (e presenciar muitas discussões que dão um né na cabeça), decidi fazer um exemplo de uma aplicação MVC, MAS me surgiram algumas dúvidas e incertezas. Estou mesmo fazendo certo?
Segue as classes:
Entidade:
package br.com.projeto.model.entity;
@Entity
@Table(name = "usuario")
public class Usuario implements java.io.Serializable {
private static final long serialVersionUID = 1L;
@Id
@Column(name = "codigo", nullable = false)
@GeneratedValue(strategy = GenerationType.SEQUENCE)
private Long codigo;
@Column(name = "login", nullable = false)
private String login;
@Column(name = "nome", nullable = false)
private String nome;
@Column(name = "senha", nullable = false)
private String senha;
@Column(name = "email", nullable = false)
private String email;
@Column(name = "data_cadastro")
@Temporal(TemporalType.TIMESTAMP)
private Date dataCadastro;
@Column(name = "classificacao")
@OneToOne
@JoinColumn(name = "codigo")
private Classificacao classificacao;
public Usuario() {}
public Usuario(String login, String nome, String email, Classificacao classificacao) {
setLogin(login);
setNome(nome);
setEmail(email);
setDataCadastro(new Date());
setClassificacao(classificacao);
}
//gets sets
Dao:
Classe abstrata:
package br.com.projeto.model.dao;
public abstract class AbstractDao<TEntity, PK> {
protected static EntityManager entityManager;
public AbstractDao(EntityManager entityManager) {
AbstractDao.entityManager = entityManager;
}
public void save(final TEntity entity) throws PersistenceException {
try {
entityManager.persist(entity);
}
catch(javax.persistence.PersistenceException pe) {
throw new PersistenceException(pe.getMessage(), pe.getCause());
}
}
public List<TEntity> list() throws PersistenceException {
String jpql = TothenUtils.concat("select x from ", getEntityClass().getSimpleName(), " x");
try {
Query query = entityManager.createQuery(jpql);
return query.getResultList();
}
catch(javax.persistence.PersistenceException pe) {
throw new PersistenceException(pe.getMessage(), pe.getCause());
}
}
public void delete(final TEntity entity) throws PersistenceException {
try {
entityManager.remove(entity);
}
catch(javax.persistence.PersistenceException pe) {
throw new PersistenceException(pe.getMessage(), pe.getCause());
}
}
public void update(final TEntity entity) throws PersistenceException {
try {
entityManager.merge(entity);
}
catch(javax.persistence.PersistenceException pe) {
throw new PersistenceException(pe.getMessage(), pe.getCause());
}
}
public TEntity read(final PK pk) throws PersistenceException {
try {
return (TEntity) entityManager.find(getEntityClass(), pk);
}
catch(javax.persistence.PersistenceException pe) {
throw new PersistenceException(pe.getMessage(), pe.getCause());
}
}
protected abstract Class<TEntity> getEntityClass();
}
UsuarioDao:
package br.com.projeto.model.dao;
public final class UsuarioDao extends AbstractDao<Usuario, Long> {
public UsuarioDao(EntityManager entityManager) {
super(entityManager);
}
@Override
protected Class<Usuario> getEntityClass() {
return Usuario.class;
}
public boolean exists(Usuario user) throws PersistenceException {
final String jpql = Utils.concat("select count(*) from ", getEntityClass().getSimpleName());
try {
Query query = entityManager.createQuery(jpql);
Integer qtde = (Integer) query.getSingleResult();
return qtde > 0;
}
catch(javax.persistence.PersistenceException pe) {
throw new PersistenceException(pe.getMessage(), pe.getCause());
}
}
}
Service (regras de negócio):
package br.com.projeto.model.service;
public class UsuarioService {
private UsuarioDao dao;
public UsuarioService(UsuarioDao dao) {
setDao(dao);
}
public void add(Usuario user) throws ValidationException {
try {
if(!dao.exists(user)) {
dao.save(user);
}
else
throw new ValidationException("Usuário já existe!");
}
catch(PersistenceException pe) {
pe.printStackTrace();
//pagina de erro
}
}
public void remove(Usuario user) throws ValidationException {
try {
if(!dao.exists(user))
throw new ValidationException("Usuário não existe!");
else
dao.delete(user);
}
catch(PersistenceException pe) {
pe.printStackTrace();
//pagina de erro
}
}
public void update(Usuario user) throws ValidationException {
try {
dao.update(user);
}
catch(PersistenceException pe) {
pe.printStackTrace();
//pagina de erro
}
}
public void setDao(UsuarioDao dao) {
this.dao = dao;
}
}
UsuarioController:
package br.com.projeto.controller;
public class UsuarioController {
private UsuarioService service;
public UsuarioController(UsuarioService service) {
setService(service);
}
public void add(Usuario user) throws ValidationException {
service.add(user);
}
public void remove(Usuario user) throws ValidationException {
service.remove(user);
}
public void update(Usuario user) throws ValidationException {
service.update(user);
}
public void setService(UsuarioService service) {
this.service = service;
}
}
Bom, o fluxo que eu imagino seria o seguinte:
Requisição do usuário na View -> Controller -> Service -> Dao
Bom, aceito sugestões e me digam, por favor, se estou no caminho certo, ou que posso mudar.
PS: Até dicas sobre excessões são bem-vindas.
Grato, j0nny