Я пытаюсь использовать 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.