JPA支持Java 8新的日期和时间API

The*_*ect 55 java jpa java-8 jpa-2.1 java-time

我正在为我的新项目使用Java 8.

我正在尝试在java 8中使用新的日期和时间api但是我不知道是否JPA 2.1完全支持这个新的日期和时间API.

请在JPA支持Java 8中的新日期和时间API中分享您的经验/意见.

我可以使用JPA 2.1安全地在Java 8中使用新的日期和时间api吗?

更新:

我正在使用Hibernate(4.3.5.Final)作为JPA实现.

GKi*_*lin 71

对于Hibernate 5.X只需添加

    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-java8</artifactId>
        <version>${hibernate.version}</version>
    </dependency>
Run Code Online (Sandbox Code Playgroud)

@NotNull
@Column(name = "date_time", nullable = false)
protected LocalDateTime dateTime;
Run Code Online (Sandbox Code Playgroud)

将无需任何额外的努力.请参阅https://hibernate.atlassian.net/browse/HHH-8844

更新:

请看看Jeff Morin评论:自从Hibernate 5.2.x就足够了

 <dependency>
     <groupId>org.hibernate</groupId>
     <artifactId>hibernate-core</artifactId>
     <version>5.2.1.Final</version>
 </dependency>
 <dependency>
     <groupId>org.springframework</groupId>
     <artifactId>spring-...</artifactId>
     <version>4.3.1.RELEASE</version>
 </dependency>
Run Code Online (Sandbox Code Playgroud)

请参阅https://github.com/hibernate/hibernate-orm/wiki/Migration-Guide---5.2并将 Hibernate 5.2与Spring framework 4.x集成

  • 从Hibernate 5.2.x开始,这些添加不再是必需的,因为这些Java 8功能已合并到Hibernate Core中. (8认同)

Nei*_*ton 19

JPA 2.1是在Java 1.8之前发布的规范,所以不要求任何支持.显然,某些实现可能支持某些Java 1.8功能.有些问题与Java 1.8字节码(例如EclipseLink)有关.我知道DataNucleus支持java.time和Java 1.8,因为那是我使用的.您必须检查您的实施是否支持级别.

已要求JPA 2.2支持java.time类型,请参阅此问题https://java.net/jira/browse/JPA_SPEC-63

  • 哦,糟糕的是,如果实体类中存在lambda表达式,则EclipseLink 2.5.1会失败.对我来说不是这样,这就是为什么一切都有所期待的原因.请参阅https://bugs.eclipse.org/bugs/show_bug.cgi?id=429992 (2认同)
  • 链接坏了. (2认同)

The*_*ect 11

JPA 2.2支持java.time

JPA 2.2现在支持LocalDate,LocalTime,LocalDateTime,OffsetTimeOffsetDateTime.

<dependency>
  <groupId>javax.persistence</groupId>
  <artifactId>javax.persistence-api</artifactId>
  <version>2.2</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

对于JPA 2.2实现,可以使用Hibernate 5.2EclipseLink 2.7.

Hibernate 5支持比JPA 2.2更多的java类型Duration,InstantZonedDateTime.

更多信息:


Ism*_*iaz 9

我在我的项目中使用Java 8,EclipseLink(JPA 2.1),PostgreSQL 9.3和PostgreSQL驱动程序-Postgresql-9.2-1002.jdbc4.jar,我可以使用新API中的LocalDateTime变量,但没有问题,但列的数据类型是数据库中的bytea,所以你只能知道我从Java应用程序中读取它.您可以使用AttributeConverter将新类转换为java.sql.Date我从Java.net中找到此代码

@Converter(autoApply = true)
public class LocalDatePersistenceConverter implements
AttributeConverter {
@Override
public java.sql.Date convertToDatabaseColumn(LocalDate entityValue) {
    return java.sql.Date.valueOf(entityValue);
}

@Override
public LocalDate convertToEntityAttribute(java.sql.Date databaseValue) {
    return databaseValue.toLocalDate();
}
Run Code Online (Sandbox Code Playgroud)

  • "没有问题,但列的数据类型是数据库中的bytea"......从一开始就存在问题.日期/时间不应序列化! (3认同)

The*_*ect 9

org.jadira.usertype可用于保存JSR 310 Date和Time API.

看看这个示例项目.

从示例项目中,

@MappedSuperclass
public class AbstractEntity {

    @Id @GeneratedValue Long id;

    @CreatedDate//
    @Type(type = "org.jadira.usertype.dateandtime.threeten.PersistentZonedDateTime")//
    ZonedDateTime createdDate;

    @LastModifiedDate//
    @Type(type = "org.jadira.usertype.dateandtime.threeten.PersistentZonedDateTime")//
    ZonedDateTime modifiedDate;
}
Run Code Online (Sandbox Code Playgroud)