Questão sobre repositórios

Um pedido contém n produtos.
Cada produto pode ser de um tipo.
Os tipos são persistidos no banco, por exemplo: tipo(id = 1, nome = Alimentação), tipo (id = 2, nome = Higiene)

Como resolver o seguinte problema:

Crio um produto novo e quero que o tipo dele seja o Alimentação.

Qual a melhor solução para esse tipo de situação?

  1. Ler do banco o Produto perisistido com nome = Alimentação e setar na entidade produto?

  2. Criar um interceptor que na persistência do Produto leia o nome do tipo e busque pelo tipo com nome alimentação e set no produto o tipo lido do BD?

Nesse caso é relativamente simples a opção 1, mas por exemplo se tivessemos varios objetos com um “Tipo” dentro de produto. Dai ja seria bem mais complexo ficar carregando objeto por objeto para poder persistir.

Essa lógica deve estar no repositório?

my god vc não precisa carregar objeto por objeto para persistir isto vem de uma combo provavelmente… no final vc ira apenas gravar no banco a fk do tipo de cada produto… vc não precisa e não deve carregar o objeto inteiro para persistilo no banco… e um tipo é vinculado a um unico produto… um produto não sera do tipo: limpesa e alimentação ao mesmo tempo correto?

o correto neste caso é:
Ler do banco o Produto perisistido com ID = id da alimentação e setar na entidade produto!

sim… isso mesmo…

mas isso ficaria no repositorio antes de fazer a persistencia?

[quote=luistiagos]my god vc não precisa carregar objeto por objeto para persistir isto vem de uma combo provavelmente… no final vc ira apenas gravar no banco a fk do tipo de cada produto… vc não precisa e não deve carregar o objeto inteiro para persistilo no banco… e um tipo é vinculado a um unico produto… um produto não sera do tipo: limpesa e alimentação ao mesmo tempo correto?

o correto neste caso é:
Ler do banco o Produto perisistido com ID = id da alimentação e setar na entidade produto![/quote]

Precisa sim e deve fazer. Pelo menos até que isso se torne um problema de performance (te garanto que nao vai acontecer em 99,9% dos casos). Trabalhe com objetos, nao com dados. Use entidades, atributos, nao pense em chave primaria e chave estrangeira, exceto quando estiver fazendo o mapeamento.

Um produto, em qualquer que seja o problema levantado, em quaisquer que sejam os requisitos da aplicacao, jamais terá uma chave estrangeira. Voce ja ouviu um usuario dizendo que o produto sabao de coco Plim-Plim possui uma chave estrangeira para a categoria sabao?

Garanto que nao, ele diz que o sabao de coco Plim-Plim é um sabao, ou é da categoria sabao. Pense em objetos nao em dados. No caso mais simples o objeto Produto possui um atributo Categoria. Entao voce tem que informar a qual Categoria o Produto pertence e nao qual a chave estrangeira da Categoria que a Tabela produto deve ter. Continuando da forma simples, voce carrega os objetos Categoria baseado nos criterios que voce precisa (todos se for o caso), popula o combo, como indicou o Luis, com as descricoes das categorias. Escolhe uma Categoria da lista, e nao um id, e atribui ao produto.

Quem é o responsavel pela busca da lista de categorias? Um repositorio de categorias.