GenericService
Conforme visto no capítulo anterior, o DAO é uma classe que contém todos
os métodos de acesso a dados. Para as regras de negócio o NEO propõe uma
classe chamada Service. Um service é apenas uma forma de organizar a
aplicação. Todas as funções de acesso a dados ficam nos DAOs e as
funções com regras de negócio ficam nos Services. O NEO possui uma
implementação genérica para os services: o GenericService.
Como determinadas regras de negócio necessitam de acesso ao
banco de dados, o GenericService necessita um GenericDAO. O GenericService
possui um atributo do tipo GenericDAO que deve ser configurado
para o funcionamento correto do GenericService. É utilizada a
injeção de dependencia para configurar o dao do service.
Sempre que existir um Service o DAO adequando será configurado. Veja o exemplo:
package teste;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.SequenceGenerator;
@Entity
@SequenceGenerator(name = "sq_aluno", sequenceName = "sq_aluno")
public class Aluno {
private Integer id;
private String nome;
@Id
@GeneratedValue(strategy=GenerationType.AUTO, generator="sq_aluno")
public Integer getId() {
return id;
}
public String getNome() {
return nome;
}
public void setId(Integer id) {
this.id = id;
}
public void setNome(String nome) {
this.nome = nome;
}
}
Bean Aluno que será configurado no Hibernate.
package teste;
import java.util.List;
import br.com.linkcom.neo.persistence.GenericDAO;
public class AlunoDAO extends GenericDAO<Aluno>{
}
DAO para o bean Aluno.
package teste;
import br.com.linkcom.neo.service.GenericService;
public class AlunoService extends GenericService<Aluno> {
}
Service para o bean Aluno.
Importante: Utilize o padrão [nome do bean]Service para configurar os Services.
Qualquer classe que extenda GenericService não precisa ser anotada com @Bean (a exemplo do GenericDAO).
O NEO ao configurar o AlunoService irá procurar um AlunoDAO para satisfazer a dependencia.
Para utilizar o DAO que o Service possui utilize o método getGenericDAO(). Exemplo:
package teste;
import br.com.linkcom.neo.service.GenericService;
public class AlunoService extends GenericService<Aluno> {
public void facaAlgo(){
AlunoDAO alunoDAO = (AlunoDAO) getGenericDAO();
alunoDAO.findAll();
.
.
.
}
}
Também é possível utilizar a injeção de dependencia para utilizar um AlunoDAO dentro do service.
Exemplo:
package teste;
import br.com.linkcom.neo.service.GenericService;
public class AlunoService extends GenericService<Aluno> {
AlunoDAO alunoDAO;
public void setAlunoDAO(AlunoDAO alunoDAO) {
this.alunoDAO = alunoDAO;
}
public void facaAlgo(){
alunoDAO.findAll();
.
.
.
}
}
Para manter a organização da aplicação é recomedável que apenas os Services façam acesso aos DAOs.
Por exemplo, para acessar métodos do AlunoDAO utiliza-se um método no AlunoService que delega a
responsabilidade ao AlunoDAO. O GenericService possui os mesmos métodos que o GenericDAO,
só que ao invés de terem a funcionalidade de acessar o banco, delegam a responsabilidade ao DAO.
Um Service pode ter referências a outros Services. Veja o exemplo:
package teste;
import br.com.linkcom.neo.service.GenericService;
public class MatriculaService extends GenericService<Matricula> {
CursoService cursoService;
MatriculaDAO matriculaDAO;
public void setCursoService(CursoService cursoService) {
this.cursoService = cursoService;
}
public void setMatriculaDAO(MatriculaDAO matriculaDAO) {
this.matriculaDAO = matriculaDAO;
}
public void matricular(Aluno aluno, Curso curso) throws Exception{
if(cursoService.temVagas(curso)){
Matricula matricula = new Matricula();
matricula.setAluno(aluno);
matricula.setCurso(curso);
matriculaDAO.saveOrUpdate(matricula);
} else {
throw new Exception("O curso escolhido não tem vagas");
}
}
}
Dica: Sempre que criar um bean que for gerenciado pelo Hibernate.
Crie também um DAO e um Service para esse bean. É fácil, e ajuda a manter a organização da aplicação.