2016-01-05 15 views
5

Prima è se voglio mappare datetime con timezone su Slick, quale classe dovrei usare OffsetDateTime o ZonedDateTime? Per quanto riguarda Joda, possiamo usare solo DateTime.Mappatura implicita Scala Slick 3.0 tra java8 OffsetDateTime e Timestamp

Come posso scrivere alcuni impliciti per la conversione tra java8 ZonedDateTime e Sql Timestamp per la mappatura delle tabelle Slick?

Sembra abbastanza semplice utilizzare joda DateTime per includere le informazioni sul fuso orario. Tuttavia, una volta passati a Java8, non sono sicuro se utilizzare ZonedDateTime o OffsetDateTime, come http://www.oracle.com/technetwork/articles/java/jf14-date-time-2125367.html suggerisce di utilizzare OffsetDateTime.

Per il mio codice corrente, uso solo Java8 LocalDateTime e scrivo in seguito implicito per mappare tra slick.

implicit val JavaLocalDateTimeMapper = MappedColumnType.base[LocalDateTime, Timestamp](
    l => Timestamp.valueOf(l), 
    t => t.toLocalDateTime 
) 

Non abbastanza sicuro che posso scrivere simile utilizzando ZonedDateTime o OffsetDateTime?

risposta

9

Risposta breve

Come di Slick 3.1, la risposta breve è quello di utilizzare OffsetDateTime, ma avrete bisogno di farlo corrispondere ad una colonna String, non un Timestamp per farlo funzionare con qualsiasi database.

Cioè, avrete bisogno di un MappedColumnType.base[OffsetDateTime, String]. È possibile utilizzare toString e OffsetDateTime.parse per la conversione di stringhe:

scala> import java.time._ 
import java.time._ 

scala> val paris = ZoneId.of("Europe/Paris") 
paris: java.time.ZoneId = Europe/Paris 

scala> OffsetDateTime.now(paris) 
res0: java.time.OffsetDateTime = 2016-01-05T20:38:46.473+01:00 

scala> OffsetDateTime.parse(res0.toString) 
res2: java.time.OffsetDateTime = 2016-01-05T20:38:46.473+01:00 

Longer risposta

La differenza tra OffsetDateTime e ZonedDateTime è coperto dalla risposta a What's the difference between java 8 ZonedDateTime and OffsetDateTime?, quindi non ripeterò qui.

Tuttavia, vorrai leggerlo per decidere se la risposta breve corrisponde alla tua situazione.

Se si utilizza Postgres, there's support for java.time tramite il progetto slick-pg. Non ho avuto la possibilità di usarlo da solo, ma chiaramente vale la pena indagare se questo è il database che stai usando. Vedere, ad esempio, the test suite per il componente aggiuntivo "date2".

The Better risposta (o, risposta Future!)

La splendida notizia è che c'è una richiesta di pull attiva per aggiungere il supporto per i tipi di dati java.time a Slick. È possibile monitorare i progressi on the ticket, che è attualmente pianificato per Slick 3.2.

+0

Grazie Richard, l'ultima risposta è quello che mi aspettavo :-) – ttt

0

C'era una forchetta, che non credo sia mai stato rilasciato, ma ha avuto il supporto tempo Java8:

https://github.com/xavier-fernandez/slick

E 'abbastanza stabile, e ho usato con HSQLDB in prod .E la relativa richiesta specifica/trazione:

https://github.com/slick/slick/pull/1349

Se siete alla ricerca di generazione di codice, non è troppo difficile, utilizzando la suddetta forcella, questo post descrive come farlo:

https://github.com/slick/slick/pull/1349#issuecomment-245566307