Duvida sobre MVC com duas classes de Modelo

Olá a todos.

Seguinte, estou com uma duvida sobre como implementar o padrão MVC para manimupar duas Classes de Modelo.

Vou dar um exemplo.
No banco de dados, tenho uma Tabela PESSOA e outra PESSOA_PF (Pessoa Fisica)
Bom, nas classes teria a classe Pessoa e PessoaPF que extends da Pessoa (Classes de Modelo) correto?

Agora preciso criar uma pagina para manipular os dados da PessoaPF (Por exemplo RG), sendo que algum dados estão na Pessoa (Por exemplo TELEFONE).
Como faria isso ?
Teria que criar mais uma classe de modelo que é a junsão das duas classes, com todos os dados.
E o acesso a tados, como faria ? (Estou implementando DAO) Poderia criar uma classe para fazer um SELECT com JOIN e retornar todos os dados de uma só vez?

Bom, qualquer duvida sobre o problema que estou tento. Só mandar uma msg que respondo.

Abraços,
Henrique

Você está no caminho certo, como PessoaFisica herda todos os atributos e comportamentos de Pessoa, você poderia, por exemplo, implementar um método obterPessoaFisica em uma classe de acesso a dados (DAO), em que você faria uma query do tipo (select * from pessoa_fisica natural join pessoa) e popularia todos os dados do objeto PessoaFisica inclusive os herdados de Pessoa. Essa prática está correta.

Você já leu algo sobre Hibernate ou JPA? A literatura sobre mapeamento objeto relacional ajuda bastante nesse tipo de problema.
http://www.hibernate.org

Abraço,
André Faria

Valeu André. Isto já ajuda muito.

Agora me gerou outra duvida.
Imagine uma situação parecia.
Uma tabela PESSOA e outra tabela SOCIOS, que tem várias pessoas e mais dados.

Como faria a parte da DAO.
teria ulgum metodo. carregaDadosSocios no qual carrega tudo.
Os dados de socios e de pessoas?
Com um select contendo join?

[quote=rick.machado]Valeu André. Isto já ajuda muito.

Agora me gerou outra duvida.
Imagine uma situação parecia.
Uma tabela PESSOA e outra tabela SOCIOS, que tem várias pessoas e mais dados.

Como faria a parte da DAO.
teria ulgum metodo. carregaDadosSocios no qual carrega tudo.
Os dados de socios e de pessoas?
Com um select contendo join?[/quote]

Quando este monte de dúvida com SQLs começam a aparecer, significa que você deve tomar um rumo: ou segue uma tipologia de MER mais estruturada / se mata com os ‘join´s’ da vida / ou começa a pensar em objetos relacionais, especificações jpa e hibernate ou OJB.

Analize bem. Nem sempre é uma boa solucao refinar seu MER a ponto de ter uma tabela para cada classe. É por isso que inventaram o Hibernate. Para servir como um driver, que transforma estruturas em ORM e vice-versa.

Se você encarar que um sócio é uma pessoa física você desenvolver algo do tipo:

public class Pessoa {//atributos e comportamentos}
public class PessoaFisica extends Pessoa {//atributos e comportamentos}
public class Socio extends PessoaFisica {//atributos e comportamentos}

No banco de dados seria algo assim:

create table pessoa { integer pessoa_key primary key, varchar(50) nome, etc… }
create table pessoa_fisica { integer pessoa_key primary key references pessoa(pessoa_key), number(12) cpf, etc… }
create table socio { integer pessoa_key primary key references pessoa_fisica(pessoa_key), number(4,2) participacao, etc… }

note que a chave primária de pessoa_fisica é a mesma de pessoa com um foreing key para a pessoa (indica que pessoa_fisica “é uma” pessoa, a chave primária de socio é a mesma de pessoa_fisica, indica que socio “é uma” pessoa física).

Você poderia ter um método no SocioDao, por exemplo, listarSocios em que você retornaria um lista de Socios com todos os dados de pessoa, pessoa_fisica e socio, algo do tipo

select *
from pessoa p
inner join pessoa_fisica pf on (p.pessoa_key = pf.pessoa_key)
inner join socio s on (s.pessoa_key = pf.pessoa_key)

para cada registro retornado popularia-se um objeto socio e adicionaria-se em uma lista (java.util.List), assim você teria uma lista com todos os Sócios, essa não é a única abordagem para esse problema, alguma pessoas prefeririam encarar que sócio é um papel que uma pessoa desenpenha e não que sócio é uma pessoa, e então utilizaria outra forma resolver isso… Essa é abordagem da UML em cores por exemplo, vale dar uma olhada. Pesquise por UML em Cores, de Peter Coad…

Espero ter ajudado um pouco…

Abraço,
André Faria

[quote=rick.machado]Olá a todos.

Seguinte, estou com uma duvida sobre como implementar o padrão MVC para manimupar duas Classes de Modelo.

Vou dar um exemplo.
No banco de dados, tenho uma Tabela PESSOA e outra PESSOA_PF (Pessoa Fisica)
Bom, nas classes teria a classe Pessoa e PessoaPF que extends da Pessoa (Classes de Modelo) correto?
[/quote]

PESSOA E PESSOA_PF não são suas classes de modelo. São suas classes de dominio (negocio).
Vc está incorrendo num erro ao assumir que a classe de modelo <=> classe de negocio(dominio) e como essa equivalencia não é verdadeira tem este problema.

A classe de modelo é um classe que conversa com as classes de view e control e que conhece as classes de dominio. Se o seu view precisa dos campos A, B e C , o seu modelo deve dar-lhe esses campos. Não importa o que a classe modelo tem que fazer, quem ela tem que chamar, como, onde, porquê , etc. Por isto sempre só existe uma classe de modelo (ela está vinculada ao View e ao Controller), embora várias classes de dominio(negocio) possam estar envolvidas.

Como sempre o Sergio esta certo.

Eu me pergunto pq as pessoas confundem tanto model-view-controller com arquitetura em tres camadas (apresentacao-negocios-persistencia). Sera q eh pq sao tres? Se vc falar em Huguinho, Zezinho e Luisinho sera q vao confundir tbm com MVC?

Obs: Nada contra quem postou a duvida. Fez mais do q o certo perguntando. E eu mesmo ja vi varios artigos em q existe essa confusao o q aumenta a no na cabeca de quem esta tentando aprender.

http://fragmental.com.br/wiki/index.php/Evitando_VOs_e_BOs
http://fragmental.com.br/wiki/index.php/MVC_e_Camadas

[]s