0 Вопрос: проверка гибернации ddl smallint vs int2

вопрос создан в Wed, May 8, 2019 12:00 AM

У меня есть устаревшее приложение, которое я хочу обновить до JPA. Для локальной разработки и тестирования я настроил базу данных H2 в памяти, на тестовом и рабочем серверах есть база данных PostgreSQL, которая определяет схему, которую я хочу отобразить. Я хочу настроить Hibernate для проверки соответствия DDL (в Spring Boot с spring.jpa.hibernate.ddl-auto=validate).

В данной базе данных PostgreSQL тип столбца - SMALLINT, но тип Java соответствующего атрибута - int.

И тут возникает проблема : Если я аннотирую атрибут с помощью @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, но в коде Java INTEGER для атрибута int), поэтому Hibernate использует имя типа для сравнения типов. Но тот же тип базы данных сообщается H2 как SMALLINT и PostgreSQL как INT2 (что довольно странно, поскольку pgAdmin отображает столбец также как SMALLINT).

Можно ли как-то сказать Hibernate или драйверам JDBC, что эти два типа имен должны обрабатываться одинаково?

PS: я уже нашел некоторые ответы, которые рекомендуют использовать аннотацию @Type, однако (чтобы сделать вещи еще более сложными), атрибут int содержится в классе @Embedded, который принадлежит библиотеке и который я не могу изменить, поэтому использовать @AttributeOverrides (что, в свою очередь, не позволяет @Type).

    
0
  1. Используйте ту же базу данных в локальной разработке, которую вы используете в производственной среде, в противном случае вы будете сталкиваться с другими проблемами.
    2019-05-08 20: 25: 17Z
  2. Конечно, если это база данных в памяти, то вы хотите spring.jpa.hibernate.ddl-auto=create при работе на H2. Вы можете использовать профили Spring для включения нескольких конфигураций времени выполнения. H2 также имеет режим совместимости с Postgres. Не знаете, решит ли это ваши проблемы? h2database.com/html/features.html#compatibility
    2019-05-09 07: 16: 12Z
  3. Вероятно, правильным прагматическим решением на данный момент является отключение проверки для H2.
    2019-05-09 08: 48: 22Z
  4. Спасибо за ссылку на режим совместимости, @AlanHay (хотя это не решает проблему)
    2019-05-09 08: 49: 44Z
0 ответов                              0                         
источник размещен Вот