在 JPA 中坚持 Java 8 LocalTime
Persist Java 8 LocalTime in JPA
我的一个实体中有一个 Java 8 LocalTime。
private final LocalTime departureTime;
这是一个 Spring Boot 1.3.6 应用程序,带有 Spring Data Rest。我使用 Jsr310JpaConverters 来支持 JPA 的 Java 8 时间模块。
当我将 LocalTime 变量保存到 MySql 时,保存 LocalTime 变量的日期也被保存到数据库中。假设如果我在 2016 年 1 月 1 日保存 18:00:00 ,它会保留为 2016-01-01 18:00:00 。我只想节省时间。即 18:00:00 。有什么解决办法吗?
提前致谢
"Jsr310JpaConverters" 仅提供典型项目处理 java.time
类型所需的 AttributeConverter
可能范围的一小部分。可悲的是它的 LocalTimeConverter(大概是这里使用的),转换为 (java.util.)Date
,所以你得到存储的时间+日期。
一种解决方案是为 java.time.LocalTime
编写您自己的 JPA 2.1 AttributeConverter
,将其转换为 java.sql.Time
。
其他 JPA
提供商(例如 DataNucleus
)提供开箱即用的此类功能。
此示例运行于:java8、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>
注释->实体的映射是一样的
我的一个实体中有一个 Java 8 LocalTime。
private final LocalTime departureTime;
这是一个 Spring Boot 1.3.6 应用程序,带有 Spring Data Rest。我使用 Jsr310JpaConverters 来支持 JPA 的 Java 8 时间模块。
当我将 LocalTime 变量保存到 MySql 时,保存 LocalTime 变量的日期也被保存到数据库中。假设如果我在 2016 年 1 月 1 日保存 18:00:00 ,它会保留为 2016-01-01 18:00:00 。我只想节省时间。即 18:00:00 。有什么解决办法吗?
提前致谢
"Jsr310JpaConverters" 仅提供典型项目处理 java.time
类型所需的 AttributeConverter
可能范围的一小部分。可悲的是它的 LocalTimeConverter(大概是这里使用的),转换为 (java.util.)Date
,所以你得到存储的时间+日期。
一种解决方案是为 java.time.LocalTime
编写您自己的 JPA 2.1 AttributeConverter
,将其转换为 java.sql.Time
。
其他 JPA
提供商(例如 DataNucleus
)提供开箱即用的此类功能。
此示例运行于:java8、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>
注释->实体的映射是一样的