hibernate中的Java 8 LocalDate错误地映射到TIMESTAMP

Phi*_*ipp 8 spring hibernate jpa h2 java-time

我使用Spring boot 1.4.2,它带来了hibernate 5.0.11(JPA 2.1).我想在我的实体中使用Java 8时间类,因此包括在内hibernate-java8.

我的实体定义了LocalDate字段.

@Entity
@Table(name = "my_alarms_timeline", indexes = {...})
public class MyAlarm {
    ...
    @Column(name = "validity_date")
    @NotNull
    private LocalDate validityDate;
}
Run Code Online (Sandbox Code Playgroud)

我希望这会映射到H2数据库中的DATE.

在我的数据库中,我将其声明为validity_date DATE NOT NULL,.

当我尝试运行测试时,出现以下错误: validity_date TIMESTAMP NOT NULL,

令我惊讶的是,如果我将数据库定义更改为" hibernate-java8 我得到错误"

AttributeConverter<LocalDate, java.sql.Date>

这只是前一个的反向信息.

我也试过,而不是包括LocalDateTime,使用一个,hibernate-java8但这会产生相同的错误结果.

我该怎么做,以便我的LocalDate正确映射到数据库中的DATE?

我也试过一个validity_date DATE NOT NULL,映射到TIMESTAMP 的字段,这没有问题......

Phi*_*ipp 16

所以我通过columnDefinition="DATE"@Column注释中添加一个来运行它.

@Entity
@Table(name = "my_alarms_timeline", indexes = {...})
public class MyAlarm {
    ...
    @Column(name = "validity_date", columnDefinition = "DATE")
    @NotNull
    private LocalDate validityDate;
}
Run Code Online (Sandbox Code Playgroud)

不知道为什么没有其他人看到这个问题......

  • 这对我有用。我正在使用使用Hibernate 5.0.12的Spring Boot 1.5.4。奇怪的是,我的Entity对象中的ZonedDateTime列中的一个已映射到MySQL VARBINARY ...,但是好消息是,它已将其修复! (2认同)

std*_*bar 5

我没有在 Spring 中使用过它,但在“标准”JPA 中,我做了类似的事情:

@Converter(autoApply = true)
public class OffsetDateTimeAttributeConverter implements AttributeConverter<OffsetDateTime, Timestamp> {
    @Override
    public Timestamp convertToDatabaseColumn(OffsetDateTime entityValue) {
        if( entityValue == null )
            return null;

        return Timestamp.from(Instant.from(entityValue));
    }

    @Override
    public OffsetDateTime convertToEntityAttribute(Timestamp databaseValue) {
        if( databaseValue == null )
            return null;

        return OffsetDateTime.parse(databaseValue.toInstant().toString());
    }
}
Run Code Online (Sandbox Code Playgroud)

我的表有“带有时区的时间戳”列。然后我的 @Entity 使用 OffsetDateTime。您应该能够使用类似的方法在数据类型之间进行转换。