2013-01-03 8 views
6

Sto sviluppando una semplice webapp che espone il modello di dominio come risorse RESTful. Sto pianificando di utilizzare JPA2 (Hibernate) con il supporto REST di SpringMVC.Esiste un modo per esporre le entità di ibernazione come risorse RESTful senza DTO?

Durante il marshalling delle entità di Hibernate in XML/JSON, se l'entità è scollegata, genera LazyLoadingException per le associazioni di figli pigri. Se l'entità è ancora collegata a Hibernate Session, caricherà quasi tutto il database.

Ho provato a utilizzare Dozer CustomFieldMapper per determinare se la proprietà è Hibernate Collection pigro che non viene caricata, quindi restituisce NULL.

Ma se ci sono associazioni bidirezionali, Hibernate carica con impazienza il numero di uno su One e Dozer proverà a copiare le proprietà che finiranno nel loop infinito con conseguente errore StackOverflow.

L'unico intervento che so per risolvere questo problema è l'utilizzo di DTO e la copia delle proprietà richieste solo in POI (DDO) puliti e in marshalling in XML/JSON. Ma è terribilmente doloroso per il modello di dominio complesso copiare le proprietà manualmente.

C'è qualche altro modo pulito/più semplice per (un) marshall Entità di ibernazione?

risposta

3

Ho avuto un problema analogo con il passaggio di Hibernate'd VO avanti e indietro nelle applicazioni GWT, e in alcuni progetti ho usato Dozer con buoni risultati, e in altri progetti ho utilizzato l'approccio descritto in this article, che in pratica è null dei proxy di ibernazione prima del marshalling.

Speranza che ti aiuta,

+0

Utilizzato il codice menzionato nell'articolo, funzionante. Ma ha bisogno di testare vari tipi di relazioni. Grazie. I DTO –

4

potrei sembrare troppo conservatore, ma considerare l'utilizzo di DTOs ancora una buona idea.

La complessità dei mapping è proporzionale alla granularità dell'API delle risorse, in altre parole più grossolane e più complesse.

+2

funzionano ancora bene, se usati con cura. Io tendo ad usarli quando voglio fornire un modello più ricco di quello che forniscono le mie entità, spesso raggruppando entità diverse in un modello più compatto che può essere facilmente interagito, specialmente dal livello web. – Gimby

+2

Sono d'accordo con Gimby. A volte abbiamo bisogno di avere DTO per rappresentare i dati da presentare sull'interfaccia utente che potrebbe essere un aggregato di più entità. –

2

Date bottino in questa classe: https://github.com/viniciuspires/reqlist/blob/master/src/main/java/org/reqlist/arch/HibernateAwareObjectMapper.java

sto usando Jackson come JSON serializzatore/deserializzatore, e ho dovuto fare questa classe e aggiungere il Hibernate4Module per poter verificare se Hibernate.isInitialized e non fare accidentalmente inizializzare la proprietà.

Dopo di che basta configurarlo come ObjectMapper, e passarlo alla matrice MessageConverters, come ho fatto in questa linea:

https://github.com/viniciuspires/reqlist/blob/master/src/main/resources/META-INF/org.reqlist.context.xml#L21

che ha funzionato come un fascino per me.

Problemi correlati