【问题标题】:Java 8 LocalDate in hibernate wrongly mapped to TIMESTAMP休眠中的 Java 8 LocalDate 错误地映射到 TIMESTAMP
【发布时间】:2017-03-23 16:45:47
【问题描述】:

我使用 Spring boot 1.4.2,它带来了休眠 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;
}

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

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

当我尝试运行测试时,我收到以下错误:

[INFO] Caused by: org.hibernate.tool.schema.spi.SchemaManagementException: 
    Schema-validation: wrong column type encountered in column [validity_date] in table [my_alarms_timeline]; 
    found [date (Types#DATE)], but expecting [timestamp (Types#TIMESTAMP)]

令我惊讶的是,如果我将 DB 定义更改为 validity_date TIMESTAMP NOT NULL,,我会收到错误消息

Caused by: org.hibernate.tool.schema.spi.SchemaManagementException: 
    Schema-validation: wrong column type encountered in column [validity_date] in table [my_alarms_timeline]; 
    found [timestamp (Types#TIMESTAMP)], but expecting [date (Types#DATE)]

这只是上一条的相反消息。

我也尝试使用AttributeConverter<LocalDate, java.sql.Date>,而不是包含hibernate-java8,但这会产生相同的错误结果。

我必须怎么做才能将我的 LocalDate 正确映射到数据库中的 DATE?

我还尝试使用映射到 TIMESTAMP 的 LocalDateTime 字段,这可以正常工作...

【问题讨论】:

    标签: spring hibernate jpa h2 java-time


    【解决方案1】:

    所以我通过在@Columnannotation 中添加columnDefinition="DATE" 来运行它。

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

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

    【讨论】:

    • 这对我有用。我正在使用使用 Hibernate 5.0.12 的 Spring Boot 1.5.4。奇怪的是,我的 Entity 对象中的 ZonedDateTime 列之一被映射到 MySQL VARBINARY ......但好消息是,这修复了它!
    • 得到了这个[Request processing failed; nested exception is org.springframework.orm.jpa.JpaSystemException: could not deserialize; nested exception is org.hibernate.type.SerializationException: could not deserialize] with root cause java.io.StreamCorruptedException: invalid stream header: 32303138 at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:863) at java.io.ObjectInputStream.<init>(ObjectInputStream.java:355) at org.hibernate.internal.util.SerializationHelper$CustomObjectInputStream.<init>(SerializationHelper.java:309)
    • @jtcotton63 - 您还记得您是如何将列从VARBINARY 更改回ZonedDateTime 的吗?我在 H2 遇到了类似的问题。
    • @Bwvolleyball 不幸的是,不,我没有。如果添加 columnDefinition = "DATE" 不起作用,那么我不确定会发生什么。那是几年前的事了,我再也无法访问该代码了:/
    • 当我们从 JBoss 7.0 迁移到 JBoss 7.2.4 EAP 时,我确实遇到了这个问题。
    【解决方案2】:

    我没有在 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());
        }
    }
    

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

    【讨论】:

    • 我也尝试使用 AttributeConverter 但这失败并出现同样的错误。我想这就是 hibernate-java8 包的方法。
    【解决方案3】:

    我怀疑您的项目中某处有以下代码:

    @EntityScan(basePackageClasses = { Application.class, Jsr310JpaConverters.class })
    

    如果您使用的是 Hibernate 5.x,您应该删除对 Jsr310JpaConverters.class 的引用,否则 Hibernate 和 Spring 将尝试处理 Java 8 日期和时间对象。这可能会导致一些非常不稳定的行为(例如在不使用 UTC 的机器上运行时,LocalDate 实例以错误的值持续存在)。

    您还应该删除任何出现的:

    @Column(columnDefinition = "DATE")
    

    如果您需要它,则表明您的休眠配置存在严重问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-09-30
      • 2019-04-02
      • 2012-06-03
      • 2015-12-21
      • 2014-03-12
      • 2012-02-27
      • 2017-03-21
      相关资源
      最近更新 更多