在JPA中保留Java 8 LocalTime

时间:2016-08-10 05:04:15

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

我的一个实体中有一个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。任何解决方案?

先谢谢

2 个答案:

答案 0 :(得分:5)

此示例运行于: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>

备注 - &gt;实体的映射是相同的。

答案 1 :(得分:1)

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

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

其他JPA个提供商(例如DataNucleus)提供开箱即用的此类内容。