У меня есть объектный компонент, подобный этому:
@Column
public org.joda.time.LocalDate getAsOfDate() {
return this.asOfDate;
}
Чтобы отобразить это на SQL, я написал JPA AttributeConverter
:
import org.joda.time.LocalDate;
import javax.persistence.AttributeConverter;
import javax.persistence.Converter;
import java.sql.Date;
@Converter(autoApply = true)
public class JodaLocalDateConverter implements AttributeConverter<LocalDate, Date> {
@Override
public Date convertToDatabaseColumn(LocalDate attribute) {
return DBUtils.localDateToDate(attribute);
}
@Override
public LocalDate convertToEntityAttribute(Date dbData) {
return DBUtils.dateToLocalDate(dbData);
}
}
Когда я добавляю это в конфигурации Hibernate, DDL выглядит так:
asOfDate timestamp,
, но я ожидал бы
asOfDate date,
Я отладил Hibernate, и источником проблемы является то, что карты Hibernate все три SQL временных типа java.util.Date
(см. https://github.com/hibernate/hibernate-orm/blob/5.4.13/hibernate-core/src/main/java/org/hibernate/type/descriptor/java/JdbcDateTypeDescriptor.java#L38 и https://github.com/hibernate/hibernate-orm/blob/5.4.13/hibernate-core/src/main/java/org/hibernate/type/descriptor/java/JdbcTimeTypeDescriptor.java#L39).
Когда org.hibernate.mapping.SimpleValue.buildAttributeConverterTypeAdapter()
создает JpaAttributeConverter
, поле relationalJavaTypeDescriptor
будет использовать один из типов выше. Когда фактический тип JDB C SQL определяется с использованием org.hibernate.type.descriptor.sql.JdbcTypeJavaClassMappings
, тогда тип отображения Java будет java.util.Date
.
В Hibernate 4 это работало, но связанные строки не изменилось за 10 лет.
Как вернуть старое (правильное) сопоставление?