EJB(RMI) perdendo referencia do objeto no client

Olá, na minha estrutura client/server tenho um EJB que é chamado por um client, este client chama um método que retorna um objeto, porém este objeto quando altero não reflete para o servidor.
Quando chamo o objeto por um metodo get ele perde a referencia e não atualiza no server. Só funciona se eu declarar o objeto como public e chama-lo diretamente.
Pelos conceitos ele deveria manter a referencia remota do objeto.

No meu caso, a classe implementada no server tem um LinkedHashMap, que através de um método disponibilizado capturo um objeto neste map e o altero no client.
é isto que não funciona, somente quando disponibilizo o LinkedHashMap como public…

alguma sugestão?

O funcionamento está correto, pois se o objeto é invocado através de um método remoto ele é serializado no servidor e desserializado no cliente, sendo assim, o cliente recebe um objeto diferente. Já gastei horas debugando esse tipo de “problema” …

Já que você está trabalhando com um EJB Stateful (presumo eu) então faz todo sentido você expor um método na interface para atualizar esse objeto. Se ele está guardado em uma map, disponibilize um método para atualizar trocar o objeto na Map.

Oi,

A minha sugestão é: a tua lógica deveria estar no servidor e não no cliente.

Quando o cliente recebe um objeto tipo “Usuario” de um método como “getUsuario”, o objeto perde o link com o servidor no momento que ele chega ao cliente (detached object).
http://openejb.apache.org/jpa-concepts.html

Exemplo de como alterar objetos do lado do servidor: https://dl.dropbox.com/u/1459144/jpa-test.zip

Sim é Stateful.
O problema é que estou desenvolvendo uma camada para desenvolvedores e mudar sintaxe para eles fica tenso.
Mas por que funciona quando acesso direto o objeto como public? é como se fosse um set por baixo?

Quando vc usa algum método do teu EJB vc está realmente usando um proxy que serializa o objeto resultante (assim como rmendes08 falou).
Se vc faz esse objeto public, e se vc estiver usando o cliente e o servidor na mesma VM, vc não usa proxy nenhum.

[quote=R$chieck]Sim é Stateful.
O problema é que estou desenvolvendo uma camada para desenvolvedores e mudar sintaxe para eles fica tenso.
Mas por que funciona quando acesso direto o objeto como public? é como se fosse um set por baixo?[/quote]

Muito provavelmente quando você declara um atributo como público ele deve criar um proxy para o objeto, de forma que ao alterá-lo no cliente a mudança seja refletida no servidor. De qualquer maneira, o objeto manipulado no cliente é diferente do objeto manipulado no server.

o EJB que o client chama é um “DataSet”, que possui um Map com o nome do campo da tabela onde buscou os dados referenciando um objeto no map.
o cliente faz alterações nestes “campos” do map do ejb dataset e depois da um dataset.post() para que se persista estes dados no banco do server.
Alguma idéia de como eu poderia atualizar o Map no server, se possivel dentro do post, para que se possivel haja pouca alteração no cliente?

Cara, você vai precisar mudar o modo de operação do EJB, não tem jeito. Eu vejo duas alternativas:

1 - criar um método set(String nomeCampo, Object valor) para setar o valor do campo no EJB

2 - manipular toda a Map do lado do cliente e enviá-la de uma única vez com o método post(Map<String,Object> dataset)

para ser sincero, eu até mesmo evitaria EJB’s Stateful, como você já deve ter feito muita coisa, não compensa voltar atrás;

Ok, obrigado a voces pela ajuda, vou analizar as opções…
flw