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
Да, у тебя действительно большая проблема.
НЕ ИСПОЛЬЗУЙТЕ ОДИН ДВИГАТЕЛЬ БАЗЫ ДАННЫХ ДЛЯ ИСПЫТАНИЙ, И ДРУГОЙ ДЛЯ ПРОИЗВОДСТВА.
Вы можете столкнуться с проблемами, о которых вы никогда не мечтали.