Mapeamento Objeto-Relacional

Boa noite pessoal,

Li vários artigos sobre Mapeamento Objeto-Relacional hoje, porém, todas são totalmente teóricos.
Então preciso da ajuda de vocês para ver se entendi realmente como funciona o Mapeamento Objeto-Relacional (sem uso de frameworks).
Supondo duas classes: Fornecedor e Produto e suas respectivas tabelas no SGBD: fornecedor(id_fornecedor PK) e produto (id_produto PK, id_fornecedor FK)

Na classe Fornecedor (além do atributo do tipo int idFornecedor), uma coleção de Produtos.
Já na classe Produtos, terei (além do atributo do tipo int idProduto), uma referencia à classe Fornecedor com um objeto dela.

Até aqui tudo certo, eu imagino. Agora vem as duvidas:

  1. na classe Fornecedor, terei um método que preenchera essa minha coleção de Produtos com os dados da DAO?
  2. na classe Produto, terei um método que retorna o Fornecedor referente ao Produto, ou esse método fica na classe Fornecedor mesmo?

Quem puder dar uma força nessas dúvidas, que são mais conceituais mesmo, dei o exemplo pra poder explicar melhor.

Um grande abraço a todos e muito obrigado desde já.

$erver, sem frameworks não será possível.

O mais adequado é que vc utilize JPA pois tem uma especificação java para o mesmo. JPA, como disse, é uma especificação, ai vc pode escolher o provider (quem o implementa, hibernate, toplink, eclipselink, etc) de sua preferência.

No meu blog fiz alguns posts sobre jpa, que vao desde o início, bem passo a passo, dê uma olhada: http://serjava.blogspot.com.br/search/label/JPA, pode ser útil.

[]s

[quote=$ERVER]Boa noite pessoal,

Li vários artigos sobre Mapeamento Objeto-Relacional hoje, porém, todas são totalmente teóricos.
Então preciso da ajuda de vocês para ver se entendi realmente como funciona o Mapeamento Objeto-Relacional (sem uso de frameworks).
Supondo duas classes: Fornecedor e Produto e suas respectivas tabelas no SGBD: fornecedor(id_fornecedor PK) e produto (id_produto PK, id_fornecedor FK)

Na classe Fornecedor (além do atributo do tipo int idFornecedor), uma coleção de Produtos.
Já na classe Produtos, terei (além do atributo do tipo int idProduto), uma referencia à classe Fornecedor com um objeto dela.

Até aqui tudo certo, eu imagino. Agora vem as duvidas:

  1. na classe Fornecedor, terei um método que preenchera essa minha coleção de Produtos com os dados da DAO?
  2. na classe Produto, terei um método que retorna o Fornecedor referente ao Produto, ou esse método fica na classe Fornecedor mesmo?

Quem puder dar uma força nessas dúvidas, que são mais conceituais mesmo, dei o exemplo pra poder explicar melhor.

Um grande abraço a todos e muito obrigado desde já.[/quote]

Bom, nesse caso, eu tentaria uma abordagem mais simples, embora seja menos performática. Na minha opinião, seria terrível acoplar as entidades aos seus respectivos DAO’s, pois nesse caso elas poderiam ser usadas somente em camadas que tem acesso direto à persistência. O que eu faria seria deixar a responsabilidade de carregar os Produtos de um Fornecedor juntamente com o Fornecedor, pelo próprio DAO do Fornecedor. Você até pode usar o DAO do Produto no DAO do Fornecedor. Uma vez que existe relacionamento entre as entidades nao há problema em criar relacionamentos entre seus respectivos DAO’s.

Isso depende da navegabilidade que você deseja. Se você deseja, a partir de um Produto, acessar o seu Fornecedor, então quem tem que ter essa referência é o próprio Produto, mais uma vez, você pode fazer isso através do próprio DAO do Produto.

Claro que é possível, é lógico que ele vai ter muito trabalho em implementar a própria camada de persistência, mas precisamos estar preparados para casos em que os frameworks não nos atendem. Aqui onde trabalho mesmo, a camada de persistência foi desenvolvida in-house.

fabio, vou ler assim q eu chegar ao trabalho
mendes, entao eu posso simular o relacionamento nas minhas classes tmb? eu quero deixar cada dao responsavel por sua tabela no sgbd e os pojos simulam o relacionamento, isso ta certo? mto obrigado pela atencao e ajuda

[quote=$ERVER]fabio, vou ler assim q eu chegar ao trabalho
mendes, entao eu posso simular o relacionamento nas minhas classes tmb? eu quero deixar cada dao responsavel por sua tabela no sgbd e os pojos simulam o relacionamento, isso ta certo? mto obrigado pela atencao e ajuda[/quote]

Claro, uma das vantagens em usar ORM é a facilidade com que você pode navegar entre relacionamentos, por exemplo:

Produto p = produtoDao.findProduto(1);

String ufFornecedor = p.getFornecedor().getEndereco().getCidade().getUf();

é bem mais simples do que escrever diversas INNER JOIN na mão. Mas é claro, é o tipo de coisa que tem que ser feita com cuidado em razão do desempenho. Afinal nada é de graça;

Mas como eu disse, você pode começar com soluções não tão performáticas, mas que são mais simples de se implementar no começo.

[quote][code]view plaincopy to clipboardprint?
Produto p = produtoDao.findProduto(1);

String ufFornecedor = p.getFornecedor().getEndereco().getCidade().getUf(); [/code][/quote]

É essa forma que penso em fazer mesmo.
Bom, agora já tenho uma direção, vou tentar implementar e volto aqui.
Muito obrigado novamente.

Abraços.

Só uma pergunta, qual seria a melhor solução:

  1. Deixar as DAOs dentro dos modelos (ProdutoDAO dentro de Produto) e sempre que for pesquisar no banco só chama a Produto.findProduto(1), por exemplo()?
  2. Deixar a DAOs fora dos modelos, usando Produto p = ProdutoDAO.findProduto(1)?
    Isso tudo na camada de controle.

Acho a primeira solução mais elegante a primeira vista, porém, a segunda mais fácil de implementar. O que vocês acham?

Abraços.

Segunda opção.

OLá fabiomedeirosf ,

Então, parece que cada uma tem a sua vantagem, e o que ando vendo o pessoal mais experiente fazer é essa opção mesmo. Eu estava fazendo a primeira, tô pensando em mudar enquanto da tempo. Dá muito trabalho ter que persistir a classe Produto o tempo todo dentro dela mesmo, principalmente tendo que manter a integridade dos seus atributos, por exemplo: eu só posso executar o método getProdutos() pra retornar uma list com todos os produtos de um determinado fornecedor se esse fornecedor já estiver com o idFornecedor com valor atribuido. Deu pra entender? O que você acha sobre isso?

Muito obrigado pela atenção e um abração.

$erver, na vdd está prática de deixar separado é uma boa prática, e segue o princípio da coesão.

Num modelo mais minimalista, até não vejo tanto problema em fazer como está implementando, embora eu não aconselharia! Imagine, pouco que seu projeto cresça (pouco mesmo) já ficará bem confuso em manipular o acesso a dados.

Quanto a sua pergunta, de obtenção dos produtos de um fornecedor, o seguinte: sim ele só deverá trazer os produtos a partir do momento que o Fornecedor tiver um Id, ou seja, se ele não tiver um id, concorda que ele não existe no seu database ainda? Além disso, vc terá que ter produtos associados a este fornecedor para que o fornecedor.getListaProdutos() realmente te traga estes produtos.

Deu pra entender? No meu blog que te passei, tem um post usando DAO genérico, fica bem fácil e reaproveitável. Dê uma olhada. Num primeiro momento, parece que se cria mtas coisas, mas a pártir da segunda entidade verá o quão será beneficiado.

[]s

Agora você me convenceu de vez! hehe … Não tinha parado pra pensar na coesão ainda, e acho que tem toda a razão, a classe ia ter a tarefa de manter a consistência com os dados do sgbd, quebrando a coesão!

Sobre a integridade entendi, e concordo contigo.

Sobre o seu blog acabeide ler o artigo sobre JPA, achei muito esclarecedor. Eu já andei dando uma pesquisada sobre hibernate, e tô querendo pegar algum livro ou apostila da caelum pra estudar e passar a usar.

Infelizmente pra esse projeto tenho que fazer na unha mesmo.

Pelo princípio da coesão, mesmo que eu apenas tenha um método no meu POJO Fornecedor pra retornar uma list com os produtos de um fornecedor já quebra a coesão? Tô achando que sim, pq o POJO seria apenas pra guardar as informações, e conforme nós mesmo dissemos nesse caso, ele teria que se preocupar em retornar uma list apenas se seu id estivesse setado. É isso mesmo?

Muitíssimo obrigado pela atenção e ajuda, forte abraço.

Me desculpe, só agora vi que tem mais artigos, vou ler.

Muito obrigado, abraço.

Agora você me convenceu de vez! hehe … Não tinha parado pra pensar na coesão ainda, e acho que tem toda a razão, a classe ia ter a tarefa de manter a consistência com os dados do sgbd, quebrando a coesão!

Sobre a integridade entendi, e concordo contigo.

Sobre o seu blog acabeide ler o artigo sobre JPA, achei muito esclarecedor. Eu já andei dando uma pesquisada sobre hibernate, e tô querendo pegar algum livro ou apostila da caelum pra estudar e passar a usar.

Infelizmente pra esse projeto tenho que fazer na unha mesmo.

Pelo princípio da coesão, mesmo que eu apenas tenha um método no meu POJO Fornecedor pra retornar uma list com os produtos de um fornecedor já quebra a coesão? Tô achando que sim, pq o POJO seria apenas pra guardar as informações, e conforme nós mesmo dissemos nesse caso, ele teria que se preocupar em retornar uma list apenas se seu id estivesse setado. É isso mesmo?

Muitíssimo obrigado pela atenção e ajuda, forte abraço.[/quote]

Se você apenas manter a lista de Produtos para cada Fornecedor não há problema. Você quebraria a coesão se o objeto Fornecedor buscasse os produtos através do DAO.

Acho q entendi: na minha classe Fornecedor fica a list de produtos, mas essa classe Fornecedor nao deve ter nenhum metodo que carregue a list com dao dentro dela, eh isso msm?

abraco

[quote=$ERVER]Acho q entendi: na minha classe Fornecedor fica a list de produtos, mas essa classe Fornecedor nao deve ter nenhum metodo que carregue a list com dao dentro dela, eh isso msm?

abraco[/quote]

Sim, deixe que o FornecedorDAO faça isso para você, através do ProdutoDAO.

Isso man!

Na sua classe fornecedores vc pode ter uma List listaProdutos; e na sua classe produto um objeto: Fornecedor fornecedor;

O que contempla o relacionamento N:N, onde, 1 fornecedor pode ter N produtos e, logo, 1 produto está associado a um fornecedor!

entendi, mas por exemplo: no meu controller eu devo instanciar o pojo e a dao, buscar os produtos com dao e add a list no fornecedor atraves d fornecedor.setProdutos(). eh isso msm, faco no braco no controlador?

Não precisa, cria os POJO’s de dentro do DAO mesmo.

O DAO é responsável por carregar o objeto também(passando os valores pros atributos), ou só por pegar os dados do sgbd? Porque se for responsável apenas por pegar os dados do sgbd, ter um objeto Fornecedor dentro de FornecedorDAO quebra o conceito de coesão(já que a DAO vai ter mais do que uma responsabilidade).

Tô falando bobeira?

Muito obrigado, abraços.