Arquitetura utilizando Spring

É má prática se um service possui como atributo outro service?
Por exemplo, eu tenho uma classe que tem o seguinte código:

public void save(TaxonomiaModel taxonomiaModel,List<ConceitoModel> conceitos) { Long id = (Long) taxonomiaDAO.save(taxonomiaModel); taxonomiaModel = taxonomiaDAO.load(id); //fiz o load porque o hibernate dava uma exceção de objeto transient.... for(ConceitoModel conceitoModel: conceitos){ conceitoModel.setTaxonomiaModel(taxonomiaModel); conceitoService.save(conceitoModel); } }

Onde uma taxonomia tem vários conceitos e um conceito tem uma taxonomia, só que não posso salvar tudo junto, taxonomia.setConceitos(), porque nesse momento os conceitos ainda não conhecem o id de sua taxonomia…
Então preciso possuir no service de taxonomia o service de conceito.
Uso o service ou o DAO de conceito?
E como seria o melhor controle de transação para esse tipo de operação?
No meu caso, declarei <tx:annotation-driven transaction-manager="transactionManager" /> e coloquei na classe de implementação

Isso é uma boa prática tambpem?

Eu nao vejo problemas desde que voce nao misture as camadas. Se você vai fazer a chamada em um DAO, nao coloque um service dentro dele. Mas num service, voce pode ter os dois DAOs a sua disposição.

Eu coloquei um service invocando outro…

Não entendi quando você disse isso:

[quote=antoniopopete]só que não posso salvar tudo junto, taxonomia.setConceitos(), porque nesse momento os conceitos ainda não conhecem o id de sua taxonomia…
[/quote]

Pra mim, os conceitos não precisam saber o id da taxonomia, precisam de uma referência da taxonomia.

A boa prática é, antes de chamar o save(), a lista de conceitos já estivessem dentro de taxonomia. Assim, sua assinatura do método seria simplesmente assim:

public void save(Taxonomia taxonomia)

Repare que retirei a palavra model no nome da classe, não gosto desse tipo de firula.

Outra, ao invocar o método taxonomiaDAO.save(taxonomia), deve ser realizada, na base de dados , o “salvamento” do objeto e de seus agregados, ou seja, da Taxonomia e de seus Conceitos.

Quando você dá um save no hibernate, é retornada uma cópia do objeto que você acabou de salvar, porém em estado gerenciado. E é esta cópia que você deve lidar no seu código dali em diante (por não ter obtido a cópia, é que você recebeu uma exceção de objeto transiente), não precisa fazer um load depois.

Pra finalizar, se for o caso, não tem problema nenhum em um service chamar o outro.

Eu recebo uma cópia do id não?
Porque coloquei fazendo teste para objeto Taxonomia e deu classcastexception.
Eu poderia ter feito assim, fica até melhor porque só faço 2 operações com o banco, salvo a taxonomia e sua lista de conceitos, entretando eu só posso salvar os pais de cada conceito em uma operação de update.
EU fiz o load porque estava tendo o erro de objeto transient na hora de salvar os conceitos e não lembro porque não guardei os conceitos junto com a taxonomia, mas com certeza é porque tive alguma exception.