DAO单元测试的日期转换

时间:2018-05-22 00:03:24

标签: java hibernate jpa h2 localdate

我正在将我们的应用程序升级到支持Java 8的Date / Time API的框架版本。我已更新我们的实体模型以反映正确的类型转换(日期 - > LocalDate,timestamp - > LocalDateTime)。

我现在遇到运行我的单元测试的问题,其中转换器试图将java.sql.Date强制转换为java.sql.Timestamp。这很令人困惑,因为Timestamp不应该用于这些实体。测试SQL脚本使用TO_DATE()来设置日期,如下所示:

INSERT INTO note (id, content, date, owner_id) VALUES (1, 'test content', TO_DATE('17/12/2017', 'DD/MM/YYYY'), 1);

返回的异常是:

Caused by: java.lang.ClassCastException: java.sql.Timestamp cannot be cast to java.sql.Date
at com.<redacted>.model.jpa.LocalDateAttributeConverter.convertToEntityAttribute(LocalDateAttributeConverter.java:8)
at org.hibernate.metamodel.model.convert.internal.JpaAttributeConverterImpl.toDomainValue(JpaAttributeConverterImpl.java:45)
at org.hibernate.type.descriptor.converter.AttributeConverterSqlTypeDescriptorAdapter$2.doConversion(AttributeConverterSqlTypeDescriptorAdapter.java:140)
... 64 more

来自简单的AttributeConverter&lt;&gt;:

import javax.persistence.AttributeConverter;
import javax.persistence.Converter;
import java.sql.Date;
import java.time.LocalDate;

@Converter(autoApply = true)
public class LocalDateAttributeConverter implements AttributeConverter<LocalDate, Date> {

@Override
public Date convertToDatabaseColumn(LocalDate locDate) {
    return (locDate == null ? null : Date.valueOf(locDate));
}

@Override
public LocalDate convertToEntityAttribute(Date sqlDate) {
    return (sqlDate == null ? null : sqlDate.toLocalDate());
}
}

我可以理解它有从Timestamp到Date的问题,但是这里不应该涉及Timestamp。

完整性实体:

@XmlRootElement
@Entity(name = "notes")
public class Note implements ModelObject {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@ManyToOne(optional = false)
@JoinColumn(name = "owner_id", referencedColumnName = "id")
private User user;
private String content;
private LocalDate date;
// getters/setters omitted for brevity
}

不确定这是否会影响它,但我也为LocalTime和LocalDateTime创建了AttributeConverters。

@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 sqlTime) {
    return (sqlTime == null ? null : sqlTime.toLocalTime());
}
}



@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());
}
}

使用Hibernate 5.3.0.Final和H2 1.4.197与hibernate-java8库。

0 个答案:

没有答案