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.