У меня проблема с использованием Hibernate и PostgreSQL для производства и HSQLDB для тестирования.
Я использую нисходящий подход, позволяя Hibernate создавать схему базы данных.
Я также использую аннотации; часть сопоставления hibernate.cfg.xml содержит только такие строки, как <mapping class="package.subpackage.ClassName" />
Hibernate по умолчанию строковые переменные для переменных символов (255) в PostgreSQL, чего мне в некоторых случаях недостаточно, поэтому я должен переопределить некоторые столбцы вручную с помощью @Column(columnDefinition = "TEXT")
.
Но тип TEXT недопустим для HSQLDB, поэтому такие таблицы создать нельзя.
Может ли кто-нибудь помочь решить эту проблему?
Проблема несовместимости столбца Hibernate postgresql/hsqldb TEXT
Ответы (6)
Самый простой способ решить эту конкретную проблему, вероятно, вообще не использовать columnDefinition, а вместо этого явно указать длину столбца с помощью (например)
@Column(length=10000)
Также может быть, что вместо этого вы могли бы отобразить его с помощью @Lob(type = LobType.CLOB)
но я не уверен, что это правильно поддерживается в HSQLDB. В Postgres он должен дать вам ваш тип TEXT.
Согласен с @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
sql.syntax_pgs=true
сработало (spring boot jpa)
- person Bohemian♦; 02.03.2020
Да, у вас действительно большая проблема.
НЕ ИСПОЛЬЗУЙТЕ ОДНУ БАЗУ ДАННЫХ ДЛЯ ТЕСТИРОВАНИЯ, А ДРУГУЮ ДЛЯ ПРОИЗВОДСТВА.
Вы можете столкнуться с проблемами, о которых и не мечтали.