AttributeConverter не работает с LocalTime для LocalDateTime при создании схемы гибернации - PullRequest
0 голосов
/ 03 октября 2019

Я пытаюсь использовать AttributeConverter для сопоставления Java 8 LocalTime с LocalDateTime:

import javax.persistence.AttributeConverter;
import javax.persistence.Converter;
import java.time.LocalDateTime;
import java.time.LocalTime;

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

    @Override
    public LocalDateTime convertToDatabaseColumn(LocalTime localTime) {
        LocalDateTime localDateTime = LocalDateTime.of(1970, 1, 1, 0, 0);
        return localTime != null ? localDateTime.with(localTime) : null;
    }

    @Override
    public LocalTime convertToEntityAttribute(LocalDateTime time) {
        return time != null ? time.toLocalTime() : null;
    }

}

Однако это не работает. Когда я пытаюсь использовать его на своем объекте JPA:

@Convert(converter = LocalTimeAttributeConverter.class)
@Column(name = "hour_closed", nullable = false)
private LocalTime hourClosed;

, я получаю сообщение об ошибке:

Caused by: org.hibernate.MappingException: No Dialect mapping for JDBC type: 1705457814
    at org.hibernate.dialect.TypeNames.get(TypeNames.java:70)
    at org.hibernate.dialect.TypeNames.get(TypeNames.java:101)
    at org.hibernate.dialect.Dialect.getTypeName(Dialect.java:341)
    at org.hibernate.mapping.Column.getSqlType(Column.java:231)
    at org.hibernate.tool.schema.internal.StandardTableExporter.getSqlCreateStrings(StandardTableExporter.java:96)
    at org.hibernate.tool.schema.internal.StandardTableExporter.getSqlCreateStrings(StandardTableExporter.java:30)
    at org.hibernate.tool.schema.internal.SchemaCreatorImpl.doCreation(SchemaCreatorImpl.java:230)

При создании таблицы Hibernate. Это происходит до запуска моего интеграционного теста с использованием базы данных памяти H2. Таким образом, он использует H2 диалект.

Число 1705457814 является случайным;это разные номера каждый раз. Отладка кода Hibernate, номер это typeCode, и проблема в том, что это число не может быть «случайным», потому что Hibernate пытается найти соответствующий тип SQL, ища это число на org.hibernate.dialect.TypeNames#get(int)

Любопытно, что , если я сопоставлю столбец непосредственно с LocalDateTime, он будет работать ! Я проверяю, что AttributeConverter работал с преобразованием из LocalTime в String (вместо LocalDateTime) и преобразование для String работает нормально. Я также видел подобный случай , преобразующийся в LocalDateTime.

Кто-то знает, что это происходит? Я использую Spring Boot 1.5.22 с зависимостью hibernate-java8 в моем pom.xml.

...