Desatachar entity - EJB3

Já tentei várias vezes e nunca consegui trabalhar efetivamente com Entities que são enviados para o client remotamente de maneira eficiente (sem fazer gambi).
Gostaria de saber como desatachar um entity antes de manda-lo para o client.
ex:


@Entity
class Nota {
  @ManyToOne(joinColumn="CODIGO_CLIENTE, fetch=FetchType.LAZY)
   private Cliente cliente;
}

@Stateless
@Remote(NotaRepositorio.class)
class NotaRepositorioSession {
    public Nota consultarNota(Integer codigoNota) throws Exception {
         Nota nota = entityManager.find(Nota.class, codigoNota);
         return nota;
   }
}

class Teste {
     public void static main(String[] a) throws Exception {
       NotaRepositorio repositorio = // FAZ LOOKUP REMOTO
       Nota nota = repositorio .consultarNota(1);
       nota.getCliente() // DÁ ERRO
      }
}

Já tentou trocar o fetch de FetchType.LAZY para FetchType.EAGER?

É isso é que eu não quero !!!
Mudar o mepamento.

Agora posso mudar o tipo de fetch no momento da consulta ?

O mapeamento não muda, mas você tem uma escolha: ou usa fetch lazy, ou usa ejb. Os dois ao mesmo tempo não dá.

E no caso de uma collection como eu faço ?
E se eu quiser acessar

nota.getCliente().getEndereco().getRua();

imagina eu colocar Eager em tudo ?
O esquema é esquecer usar entities beans remotamente e usar DTOs em casos de entities complexos.

Aí temos a pergunta: pra que você quer que o EJB devolva esses objetos? Se for pra fazer alguma regra de negócio em cima, não seria mais conveniente colocar essa regra também dentro do EJB?

Um Stateless Session Bean serve pra fazer uma operação completa por si só. Se é pra devolver algo, devolva tudo o que você quer de uma só vez.

Mas tem uma coisa que me ocorreu. Você não poderia usar Stateful Session Bean? E usar um PresistenceContext do tipo Extended? Como em:

@PersistenceContext(type=PersistenceContextType.EXTENDED)
EntityManager em;

Fazer a consulta e retornar para tela em Swing, oras !!! :slight_smile:

Mas nesse caso é melhor retornar um DTO mesmo (eca !!!).