Подтвердить что ты не робот

Hibernate сериализует java.time.year и другие

Здесь hibernate-java8 JAR предоставляет адаптеры для нескольких классов, таких как Instant, LocalDate и т.д., но некоторые классы из java.time, например, Year, Month, YearMonth отсутствуют, Эти классы хранятся как неизвестные Serializable, которые бесполезно расточительны.

Конечно, я мог бы использовать int year вместо Year year, но я не думаю, что это хорошая идея.

Похоже, что запись YearJavaDescriptor должна быть довольно простой, однако мне интересно, почему она отсутствует. Особенно в случае YearMonth, я бы предпочел наличие существующего адаптера, есть ли там? Или я делаю что-то глупое?

Я не уверен, что googling ничего не возвращает.

4b9b3361

Ответ 1

Попробуйте создать конвертер - AttributeConverter для этой цели.

В прошлом я использовал что-то вроде следующего:

@Entity
public class RealEstateAgency {
    @Column(name = "createdAt")
    @Convert(converter = ZonedDateTimeConverter.class)
    private ZonedDateTime creationDate;
}

@Converter(autoApply = true)
public class ZonedDateTimeConverter implements AttributeConverter<ZonedDateTime, Date> {
 
    public Date convertToDatabaseColumn(ZonedDateTime toConvert) {
        return toConvert == null ? null : Date.from(toConvert.toInstant());
    }
 
    public ZonedDateTime convertToEntityAttribute(Date toConvert) {
        return toConvert == null ? null : ZonedDateTime.from(toConvert
                .toInstant());
    }
}

Ответ 2

Если ваш поставщик JPA не сохраняет тип разумным образом (в этом случае, поскольку он является классом Java8, который был добавлен после утверждения JPA 2.1), вам необходимо определить JPA 2.1 AttributeConverter, чтобы преобразовать его в стандартный JPA устойчивый тип (в данном случае что-то вроде java.sql.Date).