Qual seria o certo?

Estou desenvolvendo uma aplicação em JSF. Eu tenho um crud de usuario, só que na hora que estou cadastrando um usuario eu tenho que selecionar os grupos que esse usuario pertence.

No meu back bean de usuario eu tenho um serviço de usuario que tem metodos como findAll, findById, insert, update, delete. A duvida é a seguinte

O certo seria no meu back bean de usuario adicionar tambem o serviço de Grupo(possui os mesmo metodos do serviço de usuario) para na pagina jsf conseguir recuperar todos os grupos?

O certo seria no meu serviço de usuario criar um metodo findAllGrupo que chamaria o serviço de grupo, fazendo que o meu controller so ficasse com o serviço de usuario?

Ou na propria pagina jsf de usuario chamar o controle de grupo?

Alguem pode min dar uma ideia?

isso dependeria como vc quer seu projeto;

mais na monha opnião não tem problemas de você adicionar o usuario a um grupo da action usuario…

pois ele faz parte de um grupo…

Cara eu não entendi muito bem o que vc quer dizer com “Serviços” …vc esta usando webservices…ou esta se referindo aos seus métodos ???

Se esta se referindo aos métodos eu ACHO que o idela seria um CRUD genérico que cuide dos métodos de DAO e quando necessário listar grupos na sua classe Handler vc chamaria o DAO para listar os grupos…isso não teria nada haver com acoplamento…afinal as responsabilidades estão separadase e a necessidade de listar grupos após a inserção de um usário faz partte da sua lógica de negócios.

Quando falo serviço eu estou falando de uma camada do sistema. O meu serviço de usuario acessa a camada de persistencia.

Cada crud eu tenho um serviço. É nesse serviço que eu faço as validações, chamo os metodos da camada de persistencia.

Como vc definiu a aRquitetura do seu sistema ???

Partindo do front (view):

JSP chama HANDLER/MANAGEDBEAN chama SERVIÇO chama DAO.

Não entendi pq existe um serviço entre seu CRUD e seu ManagedBean…Vc esta criando um serviço diferente para cada operação e um crud diferente para cada serviço ?

pelo q eu entendi serviço está fazendo um papel de facede, num é isso ??

É exatamente assim!
JSP chama HANDLER/MANAGEDBEAN chama SERVIÇO chama DAO.

class UsuarioService{

findAll()
validateInsert()
validateUpdate()
validateDelete()

}

essa minha classe acessa as DAO.

Eu tenho um serviço para cada CRUD. E o serviço realiza todas as operações de validações e de acesso a dados daquele crud

Então cara…o seu código funciona…bem ou mal funciona.

Agora eu não achei legal esse lance de serviços. Pq parece que é preciso escrever muito mais código do que realmente necessário. No JSF já existem tags para validação de campo então pra que criar uma outra validação ???

Vc poderia muito bem validar na view (assim como era feito com javascript) e exibir uma mensagem em tempo real para o usuário de que o campo é obrigatório e quando passar pela validação vc chama o seu DAO no Handler. Só aí nessa brincadeira vc já economizou um monte de códigos com a remoção dessa classe serviços.

Agora vou te apresentar um DAO genérico para vc não ter vários DAOs. (não sei se vc conhece):

public class HibernateDAO<E> implements DAO<E> {

	private Session sessao;
	private Transaction transacao;
	
	//Construtor cria sessao do Hibernate, Poderia ser um Connection tb caso não use hibernate
	public HibernateDAO(){
                      //O método FabricaSessao.getSession(sessao) foi construído do mesmo modo que uma ConnectionFactory de JDBC
                      this.sessao = FabricaSessao.getSession(sessao);
	}

	public void atualizar(E obj) {
	     //Código para inserir objetos aqui.
                     this.sessao.update(obj);
	}

	public void beginTransaction() {
	     this.transacao = this.sessao.beginTransaction();
	}

	public void close() {
	      this.sessao.close();
	      this.sessao = null;
	}

Modo de usar no seu Handler:

Usuario usuario = new Usuario();
//Getters and Setters

	public void adicionar(){
		HibernateDAO<Usuario> dao = new HibernateDAO<Usuario>();
		dao.beginTransaction();
		dao.inserir(usuario);
		dao.commit();
		dao.close();
		dao = null;
	}

Ficou muito limpo, pouquissímo código e grande extensibilidade.

Vc compreendeu a prática ???

Eu sei que da para fazer a validação com o jsf e com o javascript. So que a empresa ja tem um framework nessa estrutura que citei. Pq esse framework não é só usado para aplicações Web, possui Dao generico e serviço generico. O que eu quero confirmar era se seria melhor no me beack bean possui 2 serviços ou ter apenas 1 serviço no back bean que esse serviço vai conter outro serviço dentro dele.

Pq no meu ver eu tenho um serviço dentro do outro esta me deixando muito acoplado e menos coeso. So que da no mesmo em relação ao back bean.

Entendi…quanto a isso só tenho uma coisa a dizer…FrameWork proprietário e um fusca 1961 sem motor são as mesmas coisas.
Não vejo como uma equipe de profissionais pode ter a idéia de desenvolver um framework posto que já existem milhões de pessoas trabalhando juntas em outros muito melhores.

Nunca trabalhei com proprietários e espero nunca precisar. Veja só que por conta disso vc esta tendo de acoplar seus serviços. Já não vejo mais como te ajudar… :smiley:

Fica ae pra glr…[]'s