Проблема несовместимости столбца Hibernate postgresql/hsqldb TEXT

У меня проблема с использованием Hibernate и PostgreSQL для производства и HSQLDB для тестирования.
Я использую нисходящий подход, позволяя Hibernate создавать схему базы данных.
Я также использую аннотации; часть сопоставления hibernate.cfg.xml содержит только такие строки, как
<mapping class="package.subpackage.ClassName" />
Hibernate по умолчанию строковые переменные для переменных символов (255) в PostgreSQL, чего мне в некоторых случаях недостаточно, поэтому я должен переопределить некоторые столбцы вручную с помощью
@Column(columnDefinition = "TEXT").
Но тип TEXT недопустим для HSQLDB, поэтому такие таблицы создать нельзя.

Может ли кто-нибудь помочь решить эту проблему?


person Nemanja    schedule 18.11.2010    source источник
comment
Вы тоже пробовали использовать Postgres для тестирования? Если да, то с какими проблемами вы столкнулись?   -  person Milen A. Radev    schedule 18.11.2010
comment
Да, я тоже использую Postgres для тестирования. Проблем с ним нет, только проблема несовместимости с hsqldb   -  person Nemanja    schedule 19.11.2010


Ответы (6)


Самый простой способ решить эту конкретную проблему, вероятно, вообще не использовать columnDefinition, а вместо этого явно указать длину столбца с помощью (например)

@Column(length=10000)

Также может быть, что вместо этого вы могли бы отобразить его с помощью @Lob(type = LobType.CLOB)

но я не уверен, что это правильно поддерживается в HSQLDB. В Postgres он должен дать вам ваш тип TEXT.

person Don Roby    schedule 18.11.2010
comment
Да, это самое простое решение, но я бы предпочел использование HSQLDB с режимом совместимости с postgres. - person G. Demecki; 25.10.2012

Согласен с @fredt. Тип данных TEXT не является стандартным типом SQL, а является расширением, поддерживаемым некоторыми движками.

Чтобы включить режим совместимости с PostgreSQL, используйте sql.syntax_pgs=true в параметрах подключения.

person G. Demecki    schedule 25.10.2012

HSQLDB 2.1 и более поздние версии имеют режим совместимости с PostgreSQL и поддерживают в этом режиме тип данных TEXT.

person fredt    schedule 14.04.2011

Чтобы H2 работал в режиме совместимости с PostgreSQL (полезно для тестирования junit).

# JDBC Driver
jdbc.driverClassName=org.h2.Driver
jdbc.url=jdbc:h2:mem:play;MODE=PostgreSQL;TRACE_LEVEL_SYSTEM_OUT=2;DB_CLOSE_DELAY=-1;IGNORECASE=TRUE;INIT=CREATE TABLE IF NOT EXISTS PG_CLASS (RELNAME text, RELKIND text);
jdbc.username=sa
jdbc.password=

# general hibernate options
hibernate.database=h2
hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect

Таблица создания PG_CLASS необходима для правильной работы Hibernate/JPA. Но в остальном - довольно бесшовно.

person terrance.a.snyder    schedule 04.07.2013

Да, просто попробуйте заставить HSQLDB работать в режиме совместимости с PostgreSQL.

jdbc.url=jdbc:h2:mem:mydb;sql.syntax_pgs=true
person Sam    schedule 31.10.2018
comment
У меня это не сработало, но независимое свойство sql.syntax_pgs=true сработало (spring boot jpa) - person Bohemian♦; 02.03.2020

Да, у вас действительно большая проблема.

НЕ ИСПОЛЬЗУЙТЕ ОДНУ БАЗУ ДАННЫХ ДЛЯ ТЕСТИРОВАНИЯ, А ДРУГУЮ ДЛЯ ПРОИЗВОДСТВА.

Вы можете столкнуться с проблемами, о которых и не мечтали.

person Szymon Lipiński    schedule 18.11.2010
comment
Да, спасибо, я имел это в виду и организовал тесты, чтобы их можно было легко запустить на обеих базах данных. Но недавно у меня было небольшое изменение, и у hsqldb начались проблемы. - person Nemanja; 19.11.2010
comment
Да и нет. Согласитесь, тестовая среда должна быть точно такой же, как рабочая среда. Но модульные тесты — это нечто другое: использование базы данных в памяти (например, Apache Derby или HSQLDB) совершенно нормально. И более того: имеет много преимуществ. - person G. Demecki; 25.10.2012
comment
Этот комментарий, вероятно, является лучшим аргументом в пользу использования более чем одного ядра базы данных для тестирования и производства, учитывая тип проекта, в котором вам нужно развернуть артефакт во многих средах. - person s.froehlich; 25.06.2014
comment
В идеале используйте одну и ту же базу данных для внутренних интеграционных тестов (тестов компонентов) и для производства, но окончательное решение зависит от многих факторов. Целью интеграционного тестирования является проверка интеграции между компонентом и слоями. Кроме того, тест должен быть быстрым, чтобы не наказывать цикл интеграции, он должен уметь быстро поднимать контекст. Таким образом, использование H2, хотя и не полностью совместимо с postgre, компенсирует и позволяет нам проверить надежность нашей разработки и интеграции компонентов. - person leon cio; 23.07.2020
comment
С другой стороны, если мы используем спящий режим, мы стремимся быть как можно более агностическими в отношении типа используемой базы данных. В этом контексте не только допустимо использовать разные типы баз данных в тестовой и рабочей среде, но и рекомендуется. - person leon cio; 23.07.2020