Agora sim, desenhando com código até uma hiena como eu entende.
A sua idéia é válida sim, mas há uma maneira que eu uso para resolver isso que funciona muito bem também, principalmente quando vc quer ou precisa fazer lazy loading:
Pessoa CONTEM Cidade
public class Pessoa {
private String nome;
private int cidadeId; /// <======================= !!!!
private Cidade cidade;
// ...
}
Então vc coloca no BeanConfig APENAS o campo cidadeId que é o campo que precisa ser gravado na tabela anyways. Logo quando vc carrega o Pessoa ela vem sem a cidade mas com o id da cidade. Daí a qualquer momento você pode pegar o ID da cidade, carregar ela (ou pegar de um cache ou lista estática) e preencher a Pessoa com o seu objeto Cidade. Pronto, vc acabou de fazer um lazy loading manual (o hibernate faz isso de forma automática o que é uma merda na minha humilde opinião).
Assim por exemplo quando vc tem que carregar uma lista de pessoas, vc não vai carregar os objetos que a Pessoa possui dentro dela, pois podem haver vários objetos dentro um do outro e carregar a hierarquia completa vai ser um peso grande, sem falar em referências em ciŕculo.
Quando vc carrega uma pessoa só vc pode então fazer um eager loading e carregar tudo se quiser ou precisar. (Vc escolhe o que carregar sempre, no seu DAO)
O principal que você precisa entender aqui é que há dois casos distintos:
-
O objeto pertence a uma lista estática, como é o caso de Cidade, ou seja, isso muito provavelmente vai estar cacheado em memória.
-
O objeto é uma entidade dinâmica, que vai estar no banco de dados, ou seja, vc vai precisar fazer uma nova consulta via DAO para carregá-lo (se o DAO vai usar um cache é problema dele).
No caso 1) vc pode converter de ID para Cidade bem rapidamente, em qualquer lugar do seu código, inclusive quando estiver carregando uma lista de Pessoas, pois o custo é muito baixo.
No case 2) vc NÃO pode converter o ID sem ir no banco de dados. O objeto Pessoa poderia ter outro objeto como Endereço por exemplo
A sua idéia é muito boa para o caso 1) mas não é boa para o caso 2), porque acho que não faz sentido instanciar um objeto que possua apenas o campo ID preenchido pela query. Ou talvez tenha. O que vc acha?