Отображение столбца TIMESTAMP из PostgreSQL в LocalDate - PullRequest
0 голосов
/ 29 октября 2018

У меня есть поле в Entity:

@Column(name = "BILL_DATE")
private LocalDate billDate;

И моя система работает с oracle и posthresql. В posgresql этот столбец имеет тип timestamp, а в oracle - date. Когда я пытаюсь запустить сервер с postgeSQL, я получаю сообщение об ошибке:

wrong column type encountered in column [bill_date] in table [charges]; found [timestamp (Types#TIMESTAMP)], but expecting [date (Types#DATE)]

если я добавлю аннотацию @Temporal(TemporalType.DATE) я получу еще одну ошибку:

Caused by: org.hibernate.AnnotationException: @Temporal should only be set on a java.util.Date or java.util.Calendar property

Но я не хочу использовать java.util.Date и java.util.Calendar. Как решить эту проблему?

1 Ответ

0 голосов
/ 29 октября 2018

Обе Дата в Oracle и Отметка времени в PostgreSQL Дата хранения и время. Действительно, согласно Документации PostgreSQL вы должны сопоставить их либо с LocalDateTime , если временная метка без часового пояса, либо с OffsetDateTime , если это с часовым поясом.

Hibernate 5 должен поддерживать Java8 Time API, в любом случае, если вы используете JPA, вы можете реализовать AttributeConverter

import javax.persistence.AttributeConverter;
import java.sql.Timestamp;
import java.time.LocalDate;

public class LocalDateConverter implements AttributeConverter < LocalDate, Timestamp > {

    @Override
    public Timestamp convertToDatabaseColumn(LocalDate attribute) {
        return attribute != null ? Timestamp.valueOf(attribute.atStartOfDay()) : null;
    }

    @Override
    public LocalDate convertToEntityAttribute(Timestamp dbData) {
        return dbData != null ? dbData.toLocalDateTime().toLocalDate() : null;
    }

}

Тогда вы можете использовать

@Convert(converter = LocalDateConverter.class)
@Column(name = "BILL_DATE")
private LocalDate billDate;
...