Dúvida em OO

3 respostas
M

Bom dia a todos.

Estou com uma dúvida em relação a uma implementação e gostaria do auxílio de vocês: possui as classes Empregado e Pessoa, que por sua vez extende a primeira.
Simplificando, seria algo como:

public class Pessoa{

  private String nome;

  /* getters e setters omitidos */

}
public class Empregado extends Pessoa{

  private String matricula;

  /* getters e setters omitidos */

}

Criei outras classes resposáveis pela persistência, as quais chamo de PessoaDAO e EmpregadoDAO. Não encontrei dificuldades em implementar a classe PessoaDAO, uma vez que ela independe da herança:

/* metodo responsavel por localizar uma pessoa */

public Pessoa findPessoa(int id){

  Pessoa pessoa = null;
  
  if( id == 1){
    pessoa = new Pessoa();
    pessoa.setNome("Joaozinho");
  }

  return pessoa;

}

Porém, ao implementar a classe EmpregadoDAO, surge a minha dívida: como realizar a pesquisa do empregado aproveitando o método findPessoa da classe PessoaDAO?

/* exemplo */

public Empregado findEmpregado(int id, String matricula){

  Pessoa pessoa = new PessoaDAO().findPessoa(id);

  /* como aproveitar os dados da pessoa no empregado a ser retornado???*/

}

Obrigado!

3 Respostas

fantomas

Se vc estiver utilizando Hibernate dá uma olhada no tutorial na parte que fala sobre mapeamentos de herança.

Acredito que vc não tenha que implementar PessoaDAO.

fwls

L

Não é uma regra do DAOs terem a mesma hierarquia dos objetos de domínio. E a resposta depende também de como você persiste a herança no banco de dados e qual método de persistência é utilizado (Hibernate, JPA, iBatis, Spring JDBC Template, JDBC puro…).

Na minha opinião, se for usar JPA, não há muita vantagem um DAO reaproveitar o outro, o “busca por id” é basicamente uma linha pra cada um.

Empregado return em.find(Empregado.class, id);

Pessoa return em.find(Pessoa.class, id);

Em caso de JDBC, e você precisar criar a query na mão, (assumindo que a herança é mapeada por coluna discriminatória) dá pra fazer o seguinte:

  1. crie a query somente em PessoaDAO, assim:
    “select * from PESSOA where tipo like ?”

  2. Crie dois construtores um padrão, outro que dá oportunidade de especialização:

PessoaDAO() {
    tipo = "_";
}

PessoaDAO(String tipo) {
    this.tipo = tipo;
}
  1. A classe EmpregadoDAO herda de PessoaDAO informando a coluna: EmpregadoDAO() { super("P"); }

  2. E o método de busca por id estará presente apenas na classe PessoaDAO.

mateusprado

Ola, vc pode utilizar Generics para fazer isso.
De uma lida sobre. Isso vai te ajudar.

Criado 6 de novembro de 2008
Ultima resposta 6 de nov. de 2008
Respostas 3
Participantes 4