JPA attribute converters for JSR-310 (Java 8) dates and times.
This project was stop gap measure until JPA_SPEC-63 was fixed in JPA 2.2. However JSR-310 support in JPA is not ready for prime time. The project serves the following purposes:
We take inspiration from the JDBC 4.2 and currently support the following conversions:
ANSI SQL | Java SE 8 |
---|---|
DATE | LocalDate |
TIME | LocalTime |
TIMESTAMP | LocalDateTime |
TIMESTAMP WITH TIMEZONE | OffsetTime (*) |
TIMESTAMP WITH TIMEZONE | ZonedDateTime (*) |
INTERVAL YEAR TO MONTH | Period (*) |
INTERVAL DAY TO SECOND | Duration (*) |
(*) requires special extensions, see below
Not supported is converting TIME WITH TIMEZONE
to OffsetTime
because it seems not very useful.
This project requires Java SE 8 (for the date and time classes) and JPA 2.1 (for the attribute converters). Java SE 9 is supported as well.
This project is very similar to montanajava/jpaattributeconverters or perceptron8/datetime-jpa and can be used in much the same way.
<dependency>
<groupId>com.github.marschall</groupId>
<artifactId>threeten-jpa</artifactId>
<version>1.12</version>
</dependency>
<persistence-unit>
…
<class>com.github.marschall.threeten.jpa.LocalTimeConverter</class>
<class>com.github.marschall.threeten.jpa.LocalDateConverter</class>
<class>com.github.marschall.threeten.jpa.LocalDateTimeConverter</class>
…
</persistence-unit>
@Entity
public class SampleEntity {
@Column
private LocalDate localDate;
@Column
private LocalTime localTime;
@Column
private LocalDateTime localDateTime;
}
All the converters have set Converter#autoApply()
to true
so they're automatically applied to all entities in the same persistence unit.
You can find a complete list of all converters in the Javadoc
Time Zone Support is documented on the wiki.
Oracle Interval Support is documented on the wiki.
If you are on Hibernate 5.x and JDBC driver properly supports JDBC 4.2 we strongly recommend using the UserTypes from the threeten-jpa-jdbc42-hibernate
subproject.
If your driver does not support JDBC 4.2 the hibernate-java8 module introduced in Hibernate 5.0.0 (no longer needed for Hibernate 5.2.0) provides functionality that is equivalent to threeten-jpa
and we recommend you use the Hibernate support instead.
The project includes the following submodule:
threeten-jpa
contains portable converters.threeten-jpa-oracle-eclipselink
contains extensions that work only with Oracle in combination with EclipseLink to map TIMESTAMP WITH TIMEZONE
to ZonedDateTime
or OffsetDateTime
.threeten-jpa-mssql-eclipselink
contains extensions that work only with an old SQL Server driver in combination with EclipseLink to map DATETIMEOFFSET
to OffsetDateTime
.threeten-jpa-mssql-hibernate
contains extensions that work only with an old SQL Server driver SQL Server in combination with Hibernate to map DATETIMEOFFSET
to OffsetDateTime
.threeten-jpa-oracle-hibernate
contains extensions that work only with Oracle in combination with Hibernate to map TIMESTAMP WITH TIMEZONE
to ZonedDateTime
to OffsetDateTime
.threeten-jpa-jdbc42-hibernate
contains extensions that work with any JDBC 4.2 compliant driver in combination with Hibernate. They map
TIMESTAMP WITH TIMEZONE
to ZonedDateTime
or OffsetDateTime
TIMESTAMP [ WITHOUT TIME ZONE ]
to LocalDateTime
TIME
to LocalTime
threeten-jpa-oracle-impl
contains the type conversion code from Oracle types to Java 8 types.threeten-jpa-zoned-hibernate
contains composite user types to support ZonedDateTime
.Tested with following JPA providers:
Tested with the following databases:
DB2 is currently not supported as IBM does not ship a JDBC 4.2 driver.
This project is licensed under the MIT license.