2010-02-03 12 views
15

Le mie entità contengono attualmente proprietà Date java. Sto iniziando a usare Joda Time per la manipolazione di date e calcoli abbastanza frequentemente. Ciò significa che devo costantemente convertire le mie date in oggetti DateTime di Joda e viceversa.Joda DateTime permanente invece di Java Data in Hibernate

Quindi mi stavo chiedendo, c'è qualche ragione per cui non dovrei cambiare le mie entità per archiviare oggetti Joda DateTime invece di oggetti Data Java?

Si prega di notare che queste entità sono persistenti tramite Hibernate. Ho trovato il progetto jodatime-hibernate, ma leggevo anche sulla mailing list di Joda che non era compatibile con le versioni più recenti di hibernate. E sembra che non sia molto ben mantenuto.

Quindi mi chiedo se sarebbe meglio continuare la conversione tra Date e DateTime, o se sarebbe saggio iniziare a persistere oggetti DateTime. La mia preoccupazione è dipendere da una libreria mal gestita.

Modifica: si noti che uno dei miei obiettivi è quello di essere in grado di memorizzare meglio le informazioni sul fuso orario. Memorizzando solo una data appare per salvare la data nel fuso orario locale. Poiché la mia applicazione può essere utilizzata a livello globale, ho bisogno di conoscere anche il fuso orario. Joda Time Hibernate sembra affrontare anche questo in the user guide.

+3

A questo punto, sembra che Tipo utente per Hibernate sia la soluzione più corrente e supportata su ibernazione joda-time. Vedere la risposta di @Chris in basso per ulteriori informazioni. – Tauren

+0

+1, mi chiedevo esattamente la stessa cosa. – Jonik

risposta

3

Penso che usare Joda DateTime come tipo di proprietà del bean sia probabilmente una buona idea. È quindi possibile fare in modo che Hibernate esegua la conversione e salvi la proprietà come formato di data del database nativo.

Ho usato personalmente jodatime-hibernate e non ho avuto alcun problema con esso (stiamo usando Hibernate 3.2.5GA).

Se si hanno dubbi su jodatime-hibernate, è sempre possibile utilizzare Hibernate's custom type mapping mechanism (che sono sicuro che sia tutto jodatime-ibernato).

+0

Mi fa piacere sapere che stai usando con successo joda-time per le proprietà dei bean. Sto usando Hibernate 3.3 che è dove sembra che le persone abbiano problemi. Ma credo che tu abbia ragione, il tempo di joda è semplicemente un tipo di ibernazione personalizzato, quindi forse con alcune modifiche riesco a farlo funzionare. – Tauren

-4

Le date non devono essere memorizzate utilizzando un livello elevato di astrazione come, ad esempio, una stringa ("2009-08-07 07:43:19 ...") né come oggetti Java. Dovrebbero essere persistenti come millisecondi dall'epoca. Sia l'ora di Joda che l'ora della data di Java normale possono darti il ​​tempo in millisecondi dall'epoca. Memorizza il numero di millisecondi trascorsi e converti in oggetti quando stai leggendo di nuovo dal tuo DB.

Gli oggetti data persistenti invece di una lunghezza è un po 'come utilizzare i numeri in virgola mobile per rappresentare gli importi monetari: si tratta in genere di un enorme odore di codice.

+4

Questo non sembra molto utile per gli utenti non orientati agli oggetti di quel database. Nessuno sarebbe in grado di interrogare lo schema e la query per tutti gli ordini effettuati oggi. Normalmente sarei d'accordo con un consiglio del genere, ma a me sembra troppo Java e centrato sull'oggetto. – duffymo

+6

La maggior parte dei database (tutti?) Hanno astrazioni della data ... –

+0

Ho sicuramente considerato di archiviare le date come un lungo (millisecondo dall'epoca), ma mi piacerebbe fare query sql di base ed essere in grado di vedere anche date leggibili. Inoltre, alcune delle mie query stanno facendo calcoli di date che non penso che il DB possa gestire con valori lunghi invece di valori di data. – Tauren

5

Joda Time Hibernate può essere utilizzato con le recenti versioni di Hibernate: potrebbe essere necessario un po 'di modifica del grafico delle dipendenze, tutto (ad esempio l'impostazione delle esclusioni). Posso anche suggerire di guardare il tipo di utente, che ho rilasciato su Sourceforge. Questo fornisce tipi di utente per Joda Time che mirano ad evitare il problema di offset del cliente che hai menzionato. Sarei lieto di ricevere qualsiasi feedback sul progetto. https://sourceforge.net/projects/usertype/files/

Saluti Chris.

3

Quindi, per riassumere:

java.util.Data

  • +   supporto nativo in Hibernate
  • - bad API

Joda Time

  • +   meglio API
  • -  mancanza di supporto nativo in Hibernate

Personalmente, se potessi mantenere il modello di dominio e di "livello di servizio" pulito da solo utilizzando una libreria di terze parti (a quanto pare User Type for Hibernate in questo caso) e l'alternativa sarebbe quella di scrivere del codice in più per fare la conversione " manualmente "ogni volta che era necessario, andavo con la libreria di terze parti.

Problemi correlati