Conceitos de DAO para classes abstratas

Boa Tarde Pessoal,

Estou começando a desenvolver utilizando o pattern Dao, e encontrei uma situação em que não sei qual a melhor alternativa.

Meu problema é o seguinte:

No modelo de Banco, eu tenho uma tabela Item, que é especializada em outras duas tabelas, itemTexto e itemImagem.

No diagrama de classes eu tenho uma classe Abstrata Item e as classes ItemTexto e ItemImagem são filhas da Classe Item.
Também tenho uma classe Pagina que é composta por diversos itens (sejam eles ItemTexto ou ItemImagem).

Qual seria a melhor alternativa para na classe Pagina criar um método que crie meus objetos Descendentes de Item a partir do Banco?

Inicialmente eu fiz um método “popularItens()” que instanciava um ItemDAO, e o ItemDAO instanciava ItemTextoDAO e ItemImagemDAO, que retornavam seus respectivos objetos criados a partir das tabelas itemImagem e ItemTexto.
Porem percebi que essa não é uma boa alternativa, pois nos Daos das classes descendentes(ItemTextoDAO e ItemImagemDAO) eu tenho que fazer Join com a tabela de Item para buscar os Campos que são da classe Abstrata Item. Isto me gera varios pontos de manutenção para a mesma consulta.

Bom espero ter sido claro o suficiente, pois descrever um problema assim através de texto é bem difícil. Estou anexando parte do diagrama de classes e do banco para ficar mais claro.

Podem me ajudar a pensar em uma alternativa melhor?

Valeu



O que seria um ponto de manutenção? Vc está fazendo várias consultas pra poder pegar os itens no banco, é isso?

[quote=Ferryman]Isto me gera varios pontos de manutenção para a mesma consulta.
[/quote]

Luiz, o que eu quis dizer foi que nos DAOS itemTextoDAO e itemImagemDAO eu acabo fazendo JOIN com a tabela ITEM para conseguir buscar os atributos que são da classe abstrata Item. Se futuramente eu tiver outra classe que extends item, o DAO tambem vai ter que fazer o join para buscar os atributos. E se minha tabela de item mudar? vou ter que alterar o comando SQL em todas os DAOS das classes que descendem de item.

Consegui passar a idéia?

valeu

Dúvidas/Sugestões:

1-Pq vc tá usando uma classe abstrata, num seria melhor usar interface?
2-Vc pode colocar os sql num arquivo separado…
3-vc pode fazer do ItemDao um classe concreta que pega o Item no banco e passar o item para o construtor das classes ItemTexto e ItemImagem.

o que vc acha?

Bom, neste caso utilizar uma interface não ajudaria já que nas classes ItemTexto e ItemImagem eu teria que implementar todos os gets e Sets, e neste caso, ItemTexto e ItemImagem são um Item.

A idéia de colocar o sql em um arquivo separado é boa, mas não resolve o problema pois eu teria 3 comandos sql usando join com a tabela de item, e se esta tabela mudar, altero os 3 comandos SQL.

ItemDAO já é uma classe concreta, a classe abstrata é a classe Item , assim sendo, nao posso passar item Para o construtor de ItemTexto e ItemImagem.

Estou aqui pensando… ItemDAO (Dao da classe abstrata Item) poderia ter o comando sql nela e eu executaria esse comando nos DAOS das classes concretas que são instanciados na ItemDAO, porem para isso eu preciso passar uma refenrência de ItemDAO ou então deixar um método estatico de obter o comando SQL, o que eu acredito não ser uma boa opção

o que vocês acham?

Usar um ferramenta de ORM não é uma opção para você?

Ela faria grande parte desse trabalho que você está reclamando.

É provavelmente resolveria… porem no até 15 de dezembro não terei tempo para estudar uma ferramenta ORM, por isso decidi usar o pattern DAO, assim acredito que quando tiver mais tempo para estudar não terei muitos problemas migrando.

valeu