Geralmente em relações 1-1 só necessitamos de algums dos atributos de um determinado objeto. ex:
Não tem por que eu carregar um objeto fornecedor completo sendo que na notafiscal eu preciso de pouquissimas informacões sobre o mesmo. ex: id e nome.
Fabricio fez um teste de carga usando um template com Join e a carga deu certo. ele só precisou por no alias dos atributos o seguinte:
select
a.id,
a.nome,
a.idcidade "
cidade.id",
b.nome "cidade.nome"
from pessoa a
left outer join cidade b on (
b.id = a.idcidade)
where
a.id = :id
Vamos dizer que eu tenha:
p := TPessoa.Create
p.id := 10;
c := session.CreateNamedQuery('LoadPessoaByID', p);
p := c.GetResult as IPessoa
O InfraOPF hoje já carrega automaticamente os 2 atributos de cidade definidos no template para p.Cidade.
Só que, se por acaso tentar acessar qualquer outro atributo de cidade que nao seja id ou nome através de p.Cidade vai ter problemas por que vao estar nulos.
Eu estava pensando em marcar este objeto cidade como Proxy e nesta anotação definir o template de carga pelo oid. Então de alguma forma (usando aspectos eu acho), ao acessar um atributo null deste objeto proxy, carregariamos o objeto usando o template definido na anotação e removeriamos depois desta nova carga a anotação de proxy do mesmo. por que neste caso cidade já estaria completamente carregado.
Usar template separado pode ser custoso. por que imagine a situação:
1 nota, ligada a: 1 fornecedor, 1 transportadora e 20 items. Cada item ligado a seu produto. Se tivermos um template para cada teriamos a execução de 24 instruçòes SQL:
1 nota
1 fornecedor
1 transportadora
1 items
20 por causa dos produtos de cada cada item.