【问题标题】:Create DATETIME in MariaDB using LocalDateTime column type in JPA使用 JPA 中的 LocalDateTime 列类型在 MariaDB 中创建 DATETIME
【发布时间】:2019-03-11 16:19:07
【问题描述】:

我需要使用 JPA 中的 LocalDateTime 列类型在 MariaDB 中创建 DATETIME 列。

我创建了这个实体:

@Column
private LocalDateTime created_at;

但是当我存放代码时,MariDB 中的列更新为DATE。我需要DATETIME

我也试过这个:

@Column
@Temporal(TemporalType.TIMESTAMP)
private LocalDateTime created_at;

但是当我部署代码时出现错误:

@Temporal should only be set on a java.util.Date or java.util.Calendar property

我使用 Java 10 和 spring-boot-starter-parent

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.5.RELEASE</version>
        <relativePath />
    </parent>

这个问题有什么解决办法吗?例如,有没有办法在不使用@Temporal 的情况下将实体的列类型设置为DATETIME

【问题讨论】:

  • 你确定你在没有@Temporal 的情况下使用了 LocalDateTime,因为 LocalDateTime 应该是数据库中的 DATETIME。当我用 spring-boot-starter-parent 尝试它时,它起作用了。
  • 原来DATETIME被创建了——我错了。

标签: java hibernate jpa spring-boot-starter


【解决方案1】:

如果要将LocalDateTime 存储在TIMESTAMP 列中,则需要实现到java.sql.Timestamp 的映射。

您需要实现AttributeConverter 接口。

@Converter(autoApply = true)
public class LocalDateTimeAttributeConverter implements AttributeConverter<LocalDateTime, Timestamp> {

    @Override
    public Timestamp convertToDatabaseColumn(LocalDateTime locDateTime) {
        return (locDateTime == null ? null : Timestamp.valueOf(locDateTime));
    }

    @Override
    public LocalDateTime convertToEntityAttribute(Timestamp sqlTimestamp) {
        return (sqlTimestamp == null ? null : sqlTimestamp.toLocalDateTime());
    }
}

【讨论】:

  • 我尝试了上面的代码,但在部署过程中我又得到了 @Temporal 应该只在 java.util.Date 或 java.util.Calendar 属性上设置
  • 你应该定义不带@Temporal的属性。
  • 所以只保留@Column
  • JPA 持久性单元需要了解转换器。这可以通过将转换器添加到 persistence.xml 来完成。
  • 删除@Temporal
猜你喜欢
  • 1970-01-01
  • 2018-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-23
  • 1970-01-01
  • 2019-04-02
  • 2018-03-24
相关资源
最近更新 更多