【问题标题】:Persist Java 8 LocalTime in JPA在 JPA 中保持 Java 8 LocalTime
【发布时间】:2016-12-16 07:39:55
【问题描述】:

我的一个实体中有一个 Java 8 LocalTime。

private final LocalTime departureTime;

这是一个带有 Spring Data Rest 的 Spring Boot 1.3.6 应用程序。我使用 Jsr310JpaConverters 来支持 JPA 的 Java 8 时间模块。

当我将 LocalTime 变量保存到 MySql 时,保存 LocalTime 变量的日期也被保存到数据库中。假设如果我在 2016 年 1 月 1 日保存 18:00:00 ,它会保留为 2016-01-01 18:00:00 。我只想节省时间。即 18:00:00 。有什么解决办法吗?

提前致谢

【问题讨论】:

  • 在您的数据库中,更改您想要节省时间的字段类型。将类型从 DateTime 更改为 time。
  • 谁创建了数据库表?该字段上有哪些注释?显然,JPA 标准不支持“最终”字段。
  • DDL 由 Spring/JPA/Hibernate 管理
  • 除非您告诉人们您在该字段上添加了什么注释以及它创建了什么架构,否则他们怎么能告诉您任何事情?
  • LocalTime 字段中没有注释。

标签: jpa spring-data-jpa java-time


【解决方案1】:

此示例运行于:java 8、JPA 2.1、Hibernate 4.3.5。

如果您使用的是 JPA 2.1 和 Hibernate 5.0 的早期版本,则可以实现 JPA AttributeConverter:

import java.sql.Time;
import java.time.LocalTime;

import javax.persistence.AttributeConverter;
import javax.persistence.Converter;

/**
 * Converter to persist LocalDate and LocalDateTime with 
 * JPA 2.1 and Hibernate older than 5.0 version
 **/

@Converter(autoApply = true)
public class LocalTimeAttributeConverter implements AttributeConverter<LocalTime, Time>{

    @Override
    public Time convertToDatabaseColumn(LocalTime localTime) {
        return (localTime == null ? null : Time.valueOf(localTime));
    }

    @Override
    public LocalTime convertToEntityAttribute(Time time) {
        return (time == null ? null : time.toLocalTime()); 
    }

}

或者如果您使用的是 Hibernate 5.0(或更高版本),您可以添加 maven 的依赖项:

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-java8</artifactId>
    <version>5.1.0.Final</version>
</dependency>

Notes -> 实体的映射是一样的。

【讨论】:

    【解决方案2】:

    “Jsr310JpaConverters”仅提供了一个典型项目处理java.time 类型所需的AttributeConverters 可能范围的一小部分。可悲的是它的LocalTimeConverter(大概是这里使用的)转换为(java.util.)Date,所以你得到了存储的时间+日期。

    一种解决方案是为java.time.LocalTime 编写您自己的JPA 2.1 AttributeConverter,将其转换为java.sql.Time

    其他JPA 提供商(例如DataNucleus)提供开箱即用的此类功能。

    【讨论】:

      猜你喜欢
      • 2015-05-31
      • 2017-04-09
      • 2016-01-10
      • 2014-10-21
      • 2018-10-04
      • 2015-04-30
      • 2015-04-05
      • 1970-01-01
      • 2014-07-06
      相关资源
      最近更新 更多