Camada de Persistência
Framework
Equivalência entre o Projeto Orientado a
Objetos e o Modelo Relacional
O BD relacional reflete exatamente as
instâncias das classes, mas com
organização distinta
Classes e Atributos
Tabela: Cliente
#IUOCliente (chave, unico)
nome (unico)
idade
debito
3476
João
34
0,00
23984
Maria
35
23,00
2983
Pedro
53
12,00
Associações de * para *
Tabela: Curso_oferece_Disciplina
#IUOCurso (chave)
#IUODisciplina (chave)
235
8746
235
347
376
347
568
899
Associações de 1 para *
Tabela: Cliente_fez_Emprestimo
#IUOCliente (chave)
#IUOEmprestimo (chave, unico)
8712
7868
8712
5221
893
8762
Associações de 1 para 1
Tabela: Pagamento_referenteA_Venda
#IUOPagamento (chave, unico)
#IUOVenda(chave, unico)
678
543
965
67
908
561
Associações Ordenadas
Tabela: Voo_guarda_Reserva
#IUOVoo (chave)
#IUOReserva(chave, unico)
Ordem
1233
12232
2
1233
4345435
1
5645
344386
2
5645
234323
3
5645
67665
1
2344
23722
1
Associações Qualificadas
Qualificador é um atributo da classe
qualificada: implementa-se como
associação para *.
Qualificador externo: implementa-se
como a associação ordenada, trocando
o índice pelo valor do qualificador
externo.
Classe de Associação
Tabela: Emprego
IUOEmprego
IUOPessoa IUOEmpresa
salario
dataContratacao
2
44
233
1000
12/03/98
21
44
278
1200
14/10/02
645
345
233
3200
11/03/90
233
33
233
3400
30/11/98
34
63
278
2300
07/02/00
346
55
3332
780
14/09/01
Associações Temporárias e
Associações do Controlador
Não são persistentes.
Herança
Tabela: PagamentoEmCheque
#IUOPagamentoEmCheque (chave) numeroDoCheque
valor
vencimento
7887879
8768769
60,00
13/02/04
9876978
6743680
12,00
15/02/04
9877655
8976876
99,88
12/05/03
8976678
4354545
80,90
17/09/04
Proxy Virtual
Um proxy virtual é um objeto muito
simples que implementa apenas duas
responsabilidades:
Se o objeto real não estiver em memória,
providenciar para que seja trazido
Repassar ao objeto real todas as
mensagens que receber em nome dele
Carregamento preguiçoso
Objetos só são trazidos para a memória
principal quando necessários para
realizar alguma colaboração
Funcionamento Geral de um
Proxy Virtual
Classe Proxy Virtual
Para qualquer mensagem recebida faça:
Se o objeto real não está em memória:
solicite o carregamento do objeto real
Fim
repasse a mensagem recebida ao objeto real.
Fim
Estruturas de Dados Virtuais
VirtualSet, VirtualList, VirtualMap
Não contêm objetos, mas seus
identificadores únicos: IUO
Estrutura de um Virtual Set
Class VirtualSet {
private Vector iuos = new Vector();
private Iterator cursor;
...
Operações de Inserção e
Remoção
...
public void add ( Object obj ) { iuos.add ( obj.iuo() ); };
public void remove (Object obj ) { iuos.remove ( obj.iuo() ); };
...
Iteração
...
public void start () { cursor = iuos.iterator() } ;
public void hastNext () { return cursor.hasNext() } ;
public void next () { BrokerManager.instance().at (cursor.next()) };
}
Materialização
É o ato de trazer um objeto da memória
secundária para a principal
É feita por brokers especializados (um
singleton para cada classe persistente)
Ao materializar um objeto o
broker:
Cria uma instância da classe persistente
Inicializa os valores dos atributos da nova
instância com valores da respectiva coluna do
banco de dados
Inicializa as coleções virtuais (associações
para *) com a lista dos OIDs dos respectivos
objetos associados
Inicializa os proxies de objetos associados
(associações para 1 ou para 0..1), com o OID
do respectivo objeto
Exemplo
Um BrokerDeCliente deve:
Criar uma instância de Cliente
Preencher os atributos nome, endereco,
telefone e debito da nova instância com os
valores armazenados nas respectivas colunas
da tabela Cliente no banco de dados. A linha
da tabela selecionada será a linha cuja chave
primária #IUOCliente corresponde ao IUO da
instância de Cliente em questão
Um BrokerDeCliente deve:
Inicializar o VirtualSet reservas da nova
instância de Cliente com os valores dos IUOs
da coluna #IUOReserva da tabela associativa
Cliente_solicitou_Reserva
Inicializar o VirtualSet emprestimos com os
valores dos IUOs da coluna #IUOEmprestimo
da tabela associativa
Cliente_fez_Emprestimo
Caches
São mapeamentos que associam IUOs
com objetos reais
O BrokerManager verifica se um objeto
está em memória consultando as
caches
Caches
Classificações:
Limpos e sujos, dependendo se estão ou
não consistentes com o banco de dados
Novos e velhos, dependendo se já existem
ou não no banco de dados
Excluídos, dependendo se foram excluídos
em memória, mas ainda não do banco de
dados
Funcionamento
Um objeto materializado é inserido em
uma OldCleanCache
Quando alterado é movido para uma
OldDirtyCache
Quando criado é inserido em uma
NewCache
Quando destruído é movido para uma
OldDeleteCache ou NewDeleteCache
Controle de Objetos Sujos
Nos métodos:
set (atributo)
associa, desassocia, adiciona e remove
(associações)
BrokerManager.instance().ficouSujo(this)
Efeitos do Committ
Efetuar um update no banco de dados para
os objetos da OldDirtyCache e mover estes
objetos para a OldCleanCache
Efetuar um insert no banco de dados para os
objetos da NewCache e mover esses objetos
para a OldCleanCache
Efetuar um remove no banco de dados para
os objetos da OldDeleteCache e remover
estes objetos da cache
Remover da cache os objetos da
NewDeleteCache
Efeitos do Rollback
remover todos os objetos de todas as
caches, exceto os da OldCleanCache
Sugestão para sistemas multiusuário
Uma OldCleanCache compartilhada por
todos os usuários
Cada usuário possuirá individualmente
sua própria OldDirtyCache,
NewDeleteCache, OldDeleteCache e
NewCache