¿Cómo inicializar entidades de Hibernate obtenidas mediante una llamada a un método remoto?

StackOverflow https://stackoverflow.com/questions/119732

  •  02-07-2019
  •  | 
  •  

Pregunta

Al llamar a un servicio remoto (p. ej.sobre RMI) para cargar una lista de entidades de una base de datos usando Hibernate, ¿cómo se gestiona para inicializar todos los campos y referencias que necesita el cliente?

Ejemplo:El cliente llama a un método remoto para cargar todos los clientes.Con cada cliente, el cliente desea que se inicialice la referencia a la lista de artículos comprados del cliente.

Puedo imaginar las siguientes soluciones:

  1. Escriba un método remoto para cada consulta especial, que inicializa los campos requeridos (por ejemplo,Hibernate.initialize()) y devuelve los objetos del dominio al cliente.

  2. Como 1.pero crear DTO

  3. Divida la consulta en varias consultas, p.uno para los clientes, un segundo para los artículos de los clientes, y dejar que el cliente administre los resultados

  4. El método remoto toma un DetachedCriteria, que es creado por el cliente y ejecutado por el servidor.

  5. Desarrollar un "patrón de precarga" personalizado, es deciruna forma para que el cliente especifique explícitamente qué propiedades precargar.

¿Fue útil?

Solución

He usado 1 en el pasado y funcionó bien.

Otros consejos

Creo que el número 5 es el motivo por el que hay una cláusula de "búsqueda" en HQL.¿Podrías usar eso o el problema es más complejo?

Estuve con un cliente que estandarizó sus proyectos en el n.° 5 y funcionó muy bien.El argumento final de una llamada de servicio era una lista separada por comas de todas las propiedades que se iban a cargar, por ejemplo:

CustomerService.getCustomerById(id, "parent, address, address.city")

Creo que utilizaron la cláusula de recuperación para esto.Implementé la misma idea una vez para jpa usando PropertyUtils para activar la carga diferida.

Este servicio remoto...¿Es otra parte de la misma aplicación?Si es así, no hay problema en compartir clases y enviar instancias de un lado a otro (lo mismo ocurre con RMI, usando stubs).

Luego está la opción de acceder a un servicio web o algo similar, donde las dos aplicaciones que se comunican no comparten clases, y esto hace que las cosas sean aún más complicadas.Estoy a punto de enfrentar este problema en un futuro cercano y estaré muy interesado en saber la respuesta.

De todos modos, mi voto es por las DTO.Creo que proporcionan la mejor y más sencilla solución, cuando corresponde, y ayudan a mantener el código simple y fácil de mantener.

Yuval=8-)

Si su servicio remoto solo existe para proporcionar datos a su cliente, entonces podría ser útil desactivar la carga diferida en todas las entidades de Hibernate.

Personalmente, sin embargo, creo que las DTO son el camino correcto a seguir.Al expresar su interfaz remota en términos de DTO, está seguro de obtener todo lo que necesita y nada que no esperaba.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top