Como inicializar entidades Hibernate buscados por uma chamada de método remoto?
Pergunta
Ao ligar para um serviço remoto (por exemplo, sobre RMI) para carregar uma lista de entidades de um banco de dados usando o Hibernate, como você gerenciá-lo para inicializar todos os campos e referências as necessidades do cliente?
Exemplo: O cliente chama um método remoto para carregar todos os clientes. Com cada cliente o cliente quer a referência à lista do cliente de artigos comprados para ser inicializado.
Eu posso imaginar as seguintes soluções:
-
Escrever um método remoto para cada consulta especial, que inicializa os campos obrigatórios (Por exemplo Hibernate.initialize ()) e regressa ao domínio objectos para o cliente.
-
Como 1. mas criar DTOs
-
Dividir a consulta-se em várias consultas, por exemplo, um para os clientes, um segundo para artigos dos clientes, e deixe o cliente gerenciar os resultados
-
O método remoto tem um DetachedCriteria, que é criado pelo cliente e executado pelo servidor
-
Desenvolver um costume "Preload-padrão", ou seja, uma maneira para que o cliente especifique explicitamente quais propriedades para pré-carga.
Solução
Eu usei 1 no passado e funcionou bem.
Outras dicas
Eu acho que o número 5 é por isso que existe uma cláusula de "buscar" em HQL. Você poderia usar isso, ou é o problema mais complexo?
Eu estive em um cliente que padronizou seus projectos em # 5 e funcionou muito bem. O argumento final de uma chamada de serviço foi uma lista separada por vírgulas de todas as propriedades a serem carregados, por exemplo:
CustomerService.getCustomerById(id, "parent, address, address.city")
Eu acredito que eles usaram a cláusula buscar para isso. Eu implementei a mesma idéia de uma vez por jpa usando PropertyUtils para acionar o carregamento lento.
Este serviço remoto ... é outra parte da mesma aplicação? se assim for, não há nenhum problema compartilhar aulas e envio de casos e para trás (o mesmo vale para RMI, usando tocos).
Depois, há a opção de acessar um serviço web ou algo similar, onde os dois aplicativos que se comunicam share sem aulas, e isso torna as coisas ainda mais complicado. Estou prestes a enfrentar este problema no futuro próximo, e eu vou estar muito interessado em saber a resposta.
De qualquer forma, o meu voto é para DTOs. Eu acho que eles fornecem o melhor e mais fácil solução, quando aplicável, e ajudar a manter o código simples e de fácil manutenção.
Yuval = 8 -)
Se o seu serviço remoto só existe para fornecer o seu cliente com os dados, em seguida, desligar o carregamento lento em todas as entidades do Hibernate pode ajudar.
Pessoalmente, no entanto, acho que DTOs são o caminho certo para ir. Ao expressar sua interface remota em termos de DTOs tiver certeza de que você tem tudo que você precisa, e nada que você não esperava.