[Prévia] [Próxima] [Prévia por assunto] [Próxima por assunto]
[Índice cronológico]
[Índice de assunto]
Re: [reverbel-sod] [EP1] Manipular estado do Customer
- Subject: Re: [reverbel-sod] [EP1] Manipular estado do Customer
- From: Francisco Reverbel <reverbel@xxxxxxxxxx>
- Date: Thu, 13 Apr 2006 19:22:20 -0300
On Sun, 2006-04-09 at 22:46 -0300, Rafael de F. Ferreira wrote:
> Estou com uma dúvida a respeito de como registrar o alguel de um
> exemplar para as entidades Customer.
>
> Na IDL do Customer não consta nenhuma operação para manipular a
> MovieCopyList dos exemplares alugados. Como a operação rentTo(...) da
> interface MovieCopy recebe uma referência remota para um Customer,
> também não posso fazer um downcast para o tipo do servant do customer.
> Sem contar que não é boa prática ficar fazendo casts o tempo todo.
>
> Eu pensei em dois workarounds, mas nenhum parece muito legal. Uma
> alternativa seria fazer o servant do Customer buscar em algum lugar
> conhecido a lista de MovieCopy's alugadas para ele no momento em que
> precisasse.
Essa solução não é ruim. Faça o servente da MovieCopy ter um campo com o
id do Customer para o qual a MovieCopy foi alugada. (Pense em como se
implementa um relacionamento 1 para N num BD relacional: colocando na
tabela correspondente à entidade que aparece com cardinalidade N uma
coluna com a chave estrangeira da tabela correspondente à entidade que
aparece com cardinalidade 1 no relacionamento.)
Para construir a lista de MovieCopies alugados para um Customer,
percorra a coleção de serventes de MovieCopy e olhe o campo "id do
Customer" de cada servente. (No caso de entidades armazenadas num BD
relacional, você faria isso com um comando SQL: "SELECT ID FROM
MOVIE_COPY MC WHERE MC.CUSTOMER_ID = CUSTOMER_ID".) Note que a coleção
de serventes de MovieCopy servirá também para implementar a interface
MovieCopyHome.
Repare que basta obter o id (chave) de cada MovieCopy. Tendo esses ids,
você pode convertê-los em referências CORBA para objetos MovieCopy
chamando poa.id_to_reference() (caso você use um POA com a política
RETAIN e deixe todos os objetos MovieCopy ativos o tempo todo) ou
poa.create_reference_with_id() (se os objetos MovieCopy não ficarem
ativos o tempo todo -- este vai ser o caso no EP2).
Você também pode fazer conversão de id em referência CORBA para
implementar o método getTaker() no servente da MovieCopy. Tendo o campo
"id do Customer" nesse servente, basta converter o id em referência
CORBA para um Customer.
Em vez de ter, no servente da MovieCopy, um campo com o id desse
Customer que alugou a MovieCopy, uma outra alternativa é ter, nesse
servente, um campo com uma referência CORBA para o Customer que alugou a
MovieCopy.
> Outra maneira seria implementar o método
> MovieCopy.rentTo(...) de modo a buscar uma referência local para o
> servant concreto do Customer no servidor através do ID dele e chamar
> uma operação como CustomerImpl.rent(MovieCopy).
Só agora entendi que você está querendo estabelecer links na outra
direção (de Customer para uma coleção de MovieCopies). Isso é
desnecessário, basta o link de MovieCopy para Customer.
Reverbel
> Alguém tem alguma sugestão?
>
> Obrigado;
> --
> Rafael de F. Ferreira.
>