У меня есть устаревшее приложение, которое я хочу обновить до JPA.Для локальной разработки и тестирования я настроил базу данных H2 в памяти, на тестовом и рабочем серверах есть база данных PostgreSQL, которая определяет схему, которую я хочу отобразить.Я хочу настроить Hibernate для проверки соответствия DDL (в Spring Boot с spring.jpa.hibernate.ddl-auto=validate
).
В указанной базе данных PostgreSQL тип столбца - SMALLINT
, но тип Java соответствующего атрибута - * 1005.*.
И тут возникает проблема : Если я аннотирую атрибут с помощью @Column(columnDefinition="SMALLINT" ...)
, тогда проверка с базой данных H2 в порядке, однако с PostgreSQL я вижу ошибку found [int2 (Types#SMALLINT)], but expecting [smallint (Types#INTEGER)]
.
Если я изменю аннотацию на @Column(columnDefinition="INT2" ...)
, то PostgreSQL будет доволен, но H2 жалуется на found [smallint (Types#SMALLINT)], but expecting [int2 (Types#INTEGER)]
.
Так что, очевидно, Types
отличаются (SMALLINT
в базе данных, но INTEGER
в коде Java для атрибута int
), поэтому Hibernate использует имя типа для сравнения типов.Но тот же тип базы данных сообщается H2 как SMALLINT
и PostgreSQL как INT2
(что довольно странно, поскольку pgAdmin отображает столбец также как SMALLINT
).
Есть ли способ, которым яможет сказать Hibernate или драйверам JDBC, что эти два типа имен должны обрабатываться одинаково?
PS: Я уже нашел несколько ответов, которые советуют использовать аннотацию @Type
, однако (чтобы сделать вещи еще более сложными),атрибут int
содержится в классе @Embedded
из библиотеки, который я не могу изменить, поэтому я должен использовать @AttributeOverrides
(что, в свою очередь, не позволяет @Type
).