Um novo método no Session simplificaria, e muito, as coisas (Load):
session := SessionFactory.OpenSession;
vObj := session.Load('TAccount', 10) as IAccount;
// internamente ele:
// 1. instanciaria o SqlCommand;
// 2. setaria o parametro;
// 3. efetuaria o GetResult
Passar o nome da classe é muito passível de erros e passar um inteiro simples é muito inflexivel (o banco pode ser legado, com chave composta, etc..). acho que a melhor abordagem seria:
vObj := TAccount.Create;
vObj.Id.AsInteger := 10;
Ssession.Load(vObj) as IAccount; // nao precisaria retornar nada o framework já preencheria o vObj
ou ainda
// nao criar a instância de TAccount e fazer
vObj := Ssession.Load(IAccount, TInfraInteger.NewFrom(10)) as IAccount;
Isso vai garantir a flexibilidade. Podemos até ter estes 2 métodos ai sobrecarregados.
Emfim, acho que ao passar um oid ele deveria ser sempre passado como um infratype.
Isso vai garantir a flexibilidade. Podemos até ter estes 2 métodos ai sobrecarregados.
Emfim, acho que ao passar um oid ele deveria ser sempre passado como um infratype.
Utilizar infratypes é melhor sim. E passar a interface em ver do nome também. Quanto a chave composta, não pode ser passado em forma de array?
Não pois a expectativa eh ter uma classe para a chave composta com as sub-chaves dentro. Assim fica mais simples implementar caching depois pois o modelo de dados fica homogêneso. Senão, imagine tentar montar uma lista de objetos carregados que depois vão precisar ser acessados por chave e metade tem uma coluna de chave e outra parte tem N. O que se usa como índice do map?
Poderia se tentar usar array SE fosse possível instanciar a classe de OID com base nisso.
na prática ficaria mais ou menos assim então, certo?
IAccountproperty ID: IAccountPK ...
...end;
Solerman, não entendi muito bem essa parte "Assim fica mais simples implementar caching depois pois o modelo de dados fica homogêneo". Cache do que exatamente?
O conceito de criar uma "subclasse" para a primary key ao meu ver não tem problema. Isso deixará os objetos normalizados, todos possuirão apenas uma propriedade que representa o OID, eliminando os problemas que vc destacou.
na prática ficaria mais ou menos assim então, certo?
Primeiramente de todos os objetos que for dado Load. Não deve existir duas instâncias gerenciadas pela pesistência de um mesmo objeto. Se vc fizer dois load da mesma PK, o objeto retornado deverá ser o mesmo. Depois poderá vir outros níveis de cache, tal qual no hibernate há hoje.
Pitacos:
> 1) Este cache seria único por Aplicaçao ou por Session?
Por session.
> 2) Se por aplicação, em um ambiente distribuido, o cache estará disponível a
> todos os usuários?
Desculpa a pergunta estúpida, mas você fala em privilégio ou algo
relacionado a encapsulamento?
> 3) Se o usuário faz uma pesquisa usando um criteria que nao seja baseado no
> Oid o cache nao poderia ser consultado. O que fazer nestes casos, apenas
> preenchemos o cache com os objetos retornados sem criar duplicidades?
A pesquisa no banco deveria buscar OIDs, então o cache será usado ao
instanciar estes OIDs quando necessário.
> 4) Este esquema de cache nao aumenta a possibilidade de inconssistências
> (quando trabalhando no estilo client-server) pelo fato de outros terminais
> estarem mudando os mesmos dado tambem?
Pode acontecer com qualquer quantidade de camadas, basta dois usuários
alterando o mesmo objeto. Aí valem aqueles esquemas para evitar erguer
uma exceção sem necessidade, tal como conferir quais informações foram
alteradas em alguma camada acima (ou abaixo?) do usuário e quais o
próprio usuário alterou. Se não houver conflito, faz um merge.
Joao Morais
Tenho algumas perguntas em relação a este cache de objetos:
1) Este cache seria único por Aplicaçao ou por Session?
2) Se por aplicação, em um ambiente distribuido, o cache estará disponível a todos os usuários?
3) Se o usuário faz uma pesquisa usando um criteria que nao seja baseado no Oid o cache nao poderia ser consultado. O que fazer nestes casos, apenas preenchemos o cache com os objetos retornados sem criar duplicidades?
4) Este esquema de cache nao aumenta a possibilidade de inconssistências (quando trabalhando no estilo client-server) pelo fato de outros terminais estarem mudando os mesmos dado tambem?