2013-01-10 5 views
14

Nel mio progetto, da qualche parte devo lavorare con un unitOfIssue di Items. Ora, vari elementi possono avere diverse unità di rappresentazione. Quindi, stavo cercando qualche API o un modo, per gestire elegantemente questa situazione.C'è qualche API disponibile per rappresentare varie unità di articoli come KG, Litro, Metro, KM, ecc.

C'è qualche API disponibile, che fornisce un modo per rappresentare queste unità? Ho sentito parlare di JScience che sembra impressionante, ma ancora una volta sto affrontando un altro problema con la mappatura in JPA. Dopo un po 'di lavoro su Google, ho scoperto che in questo contesto si sta verificando un po' di lavoro come - JScience-JPA, ma sembra che non sia ancora stabile da utilizzare in produzione.

Ho anche trovato qualcosa su JSR-275, ma da this JCP page sembra che sia stato rifiutato.

Poi mi sono imbattuto in unitsofmeasure, che non ho ancora scavato nei dettagli. Ma, di nuovo, arriva lo stesso problema. Questo può essere mappato con JPA?

Edit: - Da this SO question mi sono imbattuto in Java Numbers with Unit ma non so se è pronto per la produzione o meno.

Sono davvero confuso, specialmente dopo aver visto quelle opzioni sopra. E JPA è un'ulteriore preoccupazione sul fatto che io possa usarne qualcuna o no. Qualcuno ha mai affrontato un tale tipo di situazione e trovato una via d'uscita? Ho davvero bisogno di aiuto qui. Cosa dovrei usare? E se non c'è altra via d'uscita, quale sarebbe il modo appropriato di rappresentare queste unità. Un modo che vedo è usando enums. ma, naturalmente, quella sarebbe stata l'ultima scelta.

+0

@msandiford .. Sì, lo so. E ho citato quella cosa nella mia domanda anche con quel link. Ma non può essere usato con JPA. Problema lì. :( –

risposta

1

Ti suggerisco di scriverne uno tuo. Probabilmente potresti aver bisogno anche di Unit Of Measure Conversion.

Definizione UOM da ARTS Retail Data Model Logical View

enter image description here

e per la conversione

enter image description here

+0

Beh, scrivere la mia sarebbe la mia ultima scelta, ma se riesco a ottenere qualche API pre-compilata, allora questo mi farà risparmiare molto tempo. Vediamo se qualcuno può inventare qualcosa di magico. :) –

+0

Certo. Non sono sicuro di come sia possibile mappare con API di terze parti in JPA oppure è necessario utilizzare una sorta di codice di tipo primitivo invece di utilizzare le entità UOM. – vels4j

4

ero in un progetto in cui abbiamo avuto ampio uso di JSR-275 (prima che venisse respinto da JCP). Inizialmente non stavamo usando JPA, ma in seguito è stato deciso che dovremmo mantenere il nostro modello usando JPA 2.0 e ho dovuto occuparmi della persistenza dei miei oggetti di misura.

Questa potrebbe non essere la risposta alla tua domanda, ma potrebbe portare alcuni pensieri interessanti alla discussione.

Abbiamo preso in considerazione diverse alternative:

  1. misure sono state serializzabile, e JPA può mappare qualsiasi oggetto serializzabile. Il problema qui è che le misure sarebbero salvate come oggetti binari nel database e sarebbero soggette a tutti i problemi di serializzazione (es. Versioning, ecc.)
  2. Potremmo adattare il nostro modello mantenendo i dati in tipi non elaborati (cioè interi, doppi, ecc.) a condizione che siamo d'accordo sull'utilizzo dell'unità di misura internazionale per ogni unità. Pertanto, i campi sarebbero basati su tipi supportati da JPA, ma i getter e i setter userebbero gli oggetti indicatore. Configurare il mapping JPA in base ai campi, non alle proprietà.Il problema qui era dover modificare il modello per modificare i dati incapsulati senza influire sull'interfaccia pubblica degli oggetti del dominio.
  3. Dato che stavamo usando la modalità di ibernazione come nostro fornitore di persistenza, potremmo accettare di deviare dallo standard JPA e usare hibernate custom value types per mappare gli oggetti di misura sui corrispondenti tipi primitivi. Quindi potremmo mappare i nostri tipi usando le annotazioni di ibernazione per questo scopo. (See an example here). L'avvertimento in questo sta perdendo l'indipendenza del venditore di persistenza.

Abbiamo finito per utilizzare l'alternativa n. 3 e ha funzionato abbastanza bene per noi.

+0

La tua terza alternativa è anche ciò che mi è venuto in mente. Ora, dal momento che non abbiamo alcun oggetto 'Measure' ora, quindi non può essere considerato. Ma, per citare, in JPA, la parte di conversione può essere eseguita usando l'annotazione di 'EclipseLink @ Converter'. L'ho fatto qualche giorno fa per mappare * joda time * 'DateTime' su MySQL TimeStamp, e ha funzionato abbastanza bene. Osserverò queste conversioni creando la mia classe personalizzata. Ma ci sarebbe voluto del tempo. –

+0

@RohitJain È vero. Ci vuole del tempo per sviluppare un buon convertitore che funzioni per tutte le unità, ma una volta finito, il resto è un gioco da ragazzi. L'avvertenza è che una volta fatto ciò, si dipende da tale implementazione JPA; da quel momento dipendete dal vostro fornitore di persistenza. Non tutti hanno quel lusso :-) –

+1

@ Edwin .. Hai ragione. La dipendenza da un particolare PersistenceProvider è una preoccupazione qui. Ma se dovessi farlo da solo, sarebbe pazzamente folle. :( –

Problemi correlati