Combinazione di JAXB e JPA in un unico modello
-
16-09-2020 - |
Domanda
Devo progettare un modello di dati (in un'applicazione Java EE 6) che verrà mantenuto tramite JPA e che dovrà anche essere serializzato tramite JAXB.L'ultima volta che l'ho fatto, avevo un gruppo di classi di entità con annotazioni JAXB e un altro con annotazioni JPA.Ciò significava che dovevo avere molto codice standard per la traduzione tra i due.Sto pensando di combinarli, in modo che ogni classe abbia entrambi i tipi di annotazioni.lo so Potere essere fatto, ma la mia domanda è: Dovrebbe essere?Causerà qualche problema?
Soluzione
La domanda è un po 'troppo ampia per me per rispondere. Ma ho un'esperienza correlata specifica usando jackson sotto Jaxb con entità JPA che potresti trovare interessante.
Nel mio caso, ho avuto un modello JPA con circa tre dozzine e un sacco di riferimenti ciclici. Anche il grafico delle relazioni tra entità era quasi fortemente connesso. In altre parole, è stato possibile navigare in quasi tutte le entità nel set da qualsiasi altro seguendo le relazioni di entità. Nel mio caso, con entità come descritto e Jackson 1.5, sovrapponendo le annotazioni JAXB sulle mie entità JPA si sono rivelate una cattiva idea.
Per una cosa, Jackson 1.5 ha avuto un'infinita ricorsione sui riferimenti ciclici. Considero quell'errore dell'operatore piuttosto che un bug. Jackson è un software fantastico. Inoltre, penso che la prossima versione 1.6 fornisca nuove funzionalità da gestire questo per jackson-235 . Quindi questo potrebbe essere accusato presto!
Le mie altre difficoltà relative alla compattezza serializzata di fronte alle entità fortemente connesse. La serializzazione di tutte le mie relazioni di entità non è stata impraticabile. Avrei serializzato una quantità oscena di informazioni irrilevanti in ogni richiesta mediante ingenuamente seguendo tutte le relazioni di entità con la loro piena profondità.
Volevo specificare più serializzazioni dei miei oggetti JaxB, scegliendo uno con campi e relazioni appropriati a seconda dell'uso previsto. Ma, per quanto ne so, Jaxb e Jackson non offrono tale flessibilità. Offrono una straordinaria flessibilità nella definizione di la rappresentazione - cosa è transitorio, come elenca gli elenchi, ecc. - Ma non penso che più rappresentazioni siano possibili per un oggetto. Forse c'è un modo intelligente per definire più rappresentazioni sotto Jaxb o Jackson e passare a runtime ... Sarei interessato a imparare se esiste una cosa del genere. Forse c'è una caratteristica per questo che sono ignorante, o qualche inganno che può essere giocato con la sottoclassamento. Ma non riuscivo a trovarlo, quindi alla fine mi sono arreso e sono andato con Dto.
Ancora una volta, questo è tutto abbastanza specifico per il modello. Forse questi non sono problemi per te (o forse hai soluzioni intelligenti per questi problemi!)
Altri suggerimenti
Questo può sicuramente essere fatto.In realtà trovo più problematica la prospettiva di mantenere il codice da copiare tra i modelli.
EclipseLink è un'ottima scelta per questa applicazione poiché contiene sia un JPA (EclipseLink è l'RI e open source di TopLink) sia un'implementazione JAXB.
EclipeLink JAXB (MOXy) contiene anche una serie di estensioni per mappare entità JPA su XML:
- Mapping di base XPath
- Mappatura delle relazioni bidirezionali (utilizzando @XmlInvereseReference)
- Gestione delle relazioni tra chiavi composite
- Gestione delle classi chiave incorporate
- Gestione dei tipi java.sql.*
Per ulteriori informazioni, vedere:
DataNucleo consente la persistenza utilizzando JPA a RDBMS (utilizzando JDBC dietro le quinte) e XML (utilizzando JaxB dietro le quinte).Può interpretare le tue annotazioni JPA come definire come viene eseguita la serializzazione JAXB - è possibile aggiungere anche annotazioni JAXB se tu desideri