Problemas em em implementação de projeto

Bom dia.

Pessoal estou trabalhando em um projeto de desenvolvimento conforme o diagrama que eu anexei aqui. Porém eu estou com um problema na implementação dessas classes, mais precisamente na camada de persistencia (DAO). O cenário é o seguinte.

No meu domain eu tenho: A classe Pessoa e a partir dela extendem PessoaFisica e PessoaJuridica, e a partir de PessoaFisica eu tenho mais duas extensões Funcionario e Profissional.

Até ai tudo bem. A partir do meu model, eu fui criando as outras camamdas: Crie as interfaces para o PessoaDAO, e a partir desta interface, eu a implemento na classe PessoaDAOJPA. Depois tenho a minha camada de regas de negócio que chamo de Service que inclui a uma Interface (PessoaService) e uma implementação da mesma.

ENtão começam os problemas. Na verdade na camada de persistência. No PessoaDAOJPA, eu tenho um método de consulta, onde eu passo um paramentro STRING, dai ele faz uma pesquisa por nome ou por CPF. POrém esse método não faz sentindo existir no PessoaDaoJPA porque na minha query o Entity Pessoa não possui esses atributos. Blz, então eu faço uma pesquisa usando a Entity PessoaFisica, dai vem a pergunta ou colocação. Faz sentido eu ter um método que pesquisa uma pessoa física que retorna uma PessoaFisica na classe PEssoaDAOJPA, visto que não é responsabilidade da PEssoaDAOJPA?

Faz sentindo eu criar uma PessoaFisicaDAOJPA somente com as implementações especifica dela? Se fizer como é que eu posso retornar um Funcionario ou Profissional? Faz sentindo eu fazer o meu PessoFisicaDAOJPA extende de PessoaDAO? Se fizer, como o fica o lance de PEssoFisicaDAOJPA, herdar metedos que não são de responsabilidade dele, por exemplo salvarPessoa.

Faz sentido, eu fazer composição injetando PessoaDAOJPA dentro de PEssoaFisica, e assim delegar para o PEssoaDAOJPA o que PessoFisica não sabe fazer?

Alguém poderia me ajduar a encontra uma boa solução sem quebra as boa prática de POO?

Grato

Amigo,

Esse negócio de padrão e faz sentido, na minha opnião, é muito relativo… depende de uma série de fatores, não vejo tanto como preto/branco, certo e errado.
Entretanto no seu caso especifico irei fazer alguns comentários:

Eu não costumo fazer PessoaFisica e PessoaJuridica por herança e sim por composição! Na verdade eu costumo trabalhar que Pessoa é somente pessoa fisica, e Empresa é uma pessoa juridica. Se eu posso ter clientes de pessoa fisica e juridica, então tenho a Classe Cliente que possui algum atributo, por exemplo tipo de pessoa e então se é uma pessoa ou uma Empresa, e uso composição, mesmo por que Empresa pode ter dentro dela também uma lista de pessoas (lista de funcionários), mas isso é relativo, depende muito do seu negócio.

O DAO quanto mais especifico melhor, entretanto há também casos que é preciso extrair informações de mais de um lugar e por questões de otimização se mistura um pouco.

Injetar o DAO na entidade também não vejo como problema, só acho que tem que tomar cuidado para não colocar regras que não são da entidade, que as vezes tem mais a ver com processo dentro dela… outro cuidado é que a entidade não deve se salvar, embora activerecord pregue isso… tomando esses cuidados, quanto menos anêmica a entidade melhor.

Meus 2 centavos…