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.