Come inizializzare le entità di ibernazione recuperate da una chiamata di metodo remota?

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

  •  02-07-2019
  •  | 
  •  

Domanda

Quando si chiama un servizio remoto (ad es. tramite RMI) per caricare un elenco di entità da un database utilizzando Hibernate, come lo si gestisce per inizializzare tutti i campi e i riferimenti di cui il cliente ha bisogno?

Esempio: il client chiama un metodo remoto per caricare tutti i clienti. Con ogni cliente il cliente desidera inizializzare il riferimento all'elenco di articoli acquistati del cliente.

Posso immaginare le seguenti soluzioni:

  1. Scrivi un metodo remoto per ogni query speciale, che inizializza i campi richiesti (ad es. Hibernate.initialize ()) e restituisce gli oggetti dominio al client.

  2. Come 1. ma crea DTO

  3. Suddividi la query in più query, ad es. uno per i clienti, un secondo per gli articoli dei clienti e lasciare che il cliente gestisca i risultati

  4. Il metodo remoto accetta un DetachedCriteria, creato dal client ed eseguito dal server

  5. Sviluppa un modello di precarico personalizzato, ovvero un modo per il client di specificare esplicitamente quali proprietà precaricare.

È stato utile?

Soluzione

Ho usato 1 in passato e ha funzionato bene.

Altri suggerimenti

Penso che il numero 5 sia il motivo per cui esiste un " fetch " clausola in HQL. Potresti usarlo o il problema è più complesso?

Sono stato presso un cliente che ha standardizzato i suoi progetti su # 5 e ha funzionato davvero bene. L'argomento finale di una chiamata di servizio era un elenco separato da virgole di tutte le proprietà da caricare, ad esempio:

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

Credo che per questo abbiano usato la clausola fetch. Una volta ho implementato la stessa idea per jpa usando PropertyUtils per attivare il caricamento lento.

Questo servizio remoto ... fa parte della stessa applicazione? in tal caso, non vi è alcun problema nel condividere le classi e inviare le istanze avanti e indietro (lo stesso vale per RMI, utilizzando gli stub).

Quindi c'è la possibilità di accedere a un servizio web o qualcosa di simile, in cui le due applicazioni che comunicano non condividono classi e questo rende le cose ancora più complicate. Sto per affrontare questo problema nel prossimo futuro e sarò molto interessato a conoscere la risposta.

Ad ogni modo, il mio voto è per i DTO. Penso che forniscano la soluzione migliore e più semplice, ove applicabile, e aiutano a mantenere il codice semplice e gestibile.

Yuval = Cool

Se il tuo servizio remoto esiste solo per fornire dati al tuo cliente, potrebbe essere utile disattivare il caricamento lento su tutte le entità di Hibernate.

Personalmente, tuttavia, penso che i DTO siano la strada giusta da percorrere. Esprimendo la tua interfaccia remota in termini di DTO sei sicuro di ottenere tutto ciò di cui hai bisogno e niente che non ti aspettavi.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top