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

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

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

6 ответов

Решение

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

@Column(length=10000)

Возможно также, что вместо этого вы можете сопоставить его с @Lob(type = LobType.CLOB)

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

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

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

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

Чтобы 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. Но кроме этого - довольно легко.

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

jdbc.url=jdbc:h2:mem:mydb;sql.syntax_pgs=true

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

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

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

Другие вопросы по тегам