Usando DAO (gostaria de sugestões)

Bom, vou tentar explicar direito qual o problema.

Estou com problema nos relacionamentos! Quando eu tenho uma entidade que se relaciona com outra (uma relação simples, ex: o funcionário tem um cargo apenas), na implementação do meu DAO, não sei se trago para a memória só o Objeto Funcionario sem o cargo, ou se crio um objeto Cargo também! Pois posso ter excesso de cópias na memória! Cada vez que alguem trouxer um tecnico de hardware, por exemplo, vou buscar no banco de dados e criar um novo.

O maior problema é para relacionamentos de um para vários, seria pior ainda, trazer uma lista imensa para a memória (se isso for problema)

Bom, mas outro problema sério mesmo, é que no meu sistema existem relacionamentos complexos, então, se eu trouxer uma instancia de uma Classe, ela vai trazer outras duas entidades, e essas duas vão trazer outras, e posso chegar num loop infinito, não sei se deu pra entender.
O que eu queria saber, é como fazer uma abordagem prática desses relacionamentos?

Pensei em guardar os códigos (de cargo por exemplo) nas classes, mas isso ficaria totalmente fora da orientação a objetos!

O lance é que não posso fazer algo muito complexo, pois estou no meio da implementação, esse é meu Trabalho de Graduação, e o prazo é para outubro!

A propósito, estou criando os DAOs usando PreparedStatement e carregando as queries em arquivos de properties!

Qualquer ajuda é bem vinda.

De uma estudada em proxies e Lazy Loading… O q acontece é q, por exemplo, supomos que seu Pessoa possua um atributo Cidade, ao carregar Pessoa, vc coloca um Proxy no lugar de Cidade e no momento que vc realmente necessitar da Cidade o seu Proxy busca o mesmo, seja de sua camada de persistência ou sei lá de onde!!

Mais ou menos por aí, :wink:

Fallow

Blz, valeu, vou dar uma pesquisada!

Gostaria de saber que tipo de métodos podem ser colocados nesta classe proxy. Seria +/- isto??? Apenas métodos para recuperar cidades ??

class ProxyCidade
{

       private Cidade getCidade(int nCodCidade)
      {
            return (Cidade)cidadeDao.findByCodigo(nCodCidade) 
      }
      ....
}

Acho q isso vai depender da sua aplicação, um exemplo, seria vc ter uma interface Cidade, uma classe que implementasse cidade e fosse a própria e outra que fosse o proxy que tbm implementa Cidade. Por exemplo:

public interface Cidade {
    String getNome();
}
public class CidadeImpl implements Cidade {
   private String nome;
   public  String getNome() { return nome;  }
}
public class CidadeProxy implements Cidade {
   private Cidade instance;
   public  String getNome() { 
      loadCidade();
      return instance.getNome();  
   }

   private void loadCidade() {
      if (instance == null) {
         instance = buscaCidade(); // Vai buscar a cidade de alguma maneira
      }
   }
}

Veja q esse é um exemplo simples usando apenas a estrutura OO. O seu Pessoa possuirá um field do tipo Cidade, não importando se o mesmo é um proxy ou o cidade real, no momento que vc realmente necessitar dos dados da classe o proxy a carregará!

Existem outras maneiras de fazer proxies, como utilizar algumas APIs como CGLIB para gerar Proxies para vc!

Fallow