У меня проблема с использованием Hibernate и PostgreSQL для производства и HSQLDB для тестирования.
Я использую подход сверху вниз, позволяя Hibernate создавать схему базы данных.
Я также использую аннотации; отображение часть hibernate.cfg.xml содержит только строки, как
<mapping class="package.subpackage.ClassName" />
Hibernate переменных по умолчанию строки для символа различных (255) на PostgreSQL, не является достаточным для меня в некоторых случаях, так что я должен переопределить некоторые столбцы вручную с помощью
@Column(columnDefinition = "TEXT")
.
Но, тип TEXT недопустим для HSQLDB, поэтому эти таблицы не могут быть созданы.
Может ли кто-нибудь помочь в решении этой проблемы?Hibernate postgresql/hsqldb Проблема несовместимости столбца TEXT
ответ
Самый простой способ справиться с этой конкретной проблемы, вероятно, не использовать ColumnDefinition на всех, и вместо того, чтобы явно указать длину столбца с (например)
@Column(length=10000)
Это также может быть то, что вы могли бы вместо сопоставьте его с @Lob (type = LobType.CLOB)
, но я не уверен, что это поддерживается в HSQLDB. В Postgres он должен предоставить вам тип TEXT.
Да, спасибо, длина делает трюк! – Nemanja
Да, это самое простое решение, но я бы предпочел использовать HSQLDB в режиме совместимости с postgres. –
Да, у вас есть действительно большой проблема.
НЕ ИСПОЛЬЗУЙТЕ ДВИГАТЕЛЬ ДАННОЙ БАЗЫ ДАННЫХ ДЛЯ ТЕСТИРОВАНИЯ И ДРУГОГО ДЛЯ ПРОИЗВОДСТВА.
Вы можете столкнуться с проблемами, о которых вы никогда не мечтали.
Да, спасибо, я имел это в виду, и я организовал тесты, чтобы их можно было легко запустить в обеих базах данных. Но недавно у меня было это небольшое изменение, и hsqldb начал создавать проблемы. – Nemanja
Да и Нет. Согласитесь, что тестовая среда ** должна быть точно такой же, как в производственной среде. Но модульные тесты - это нечто другое: использование базы данных в памяти (например, Apache Derby или HSQLDB) отлично. И еще: имеет много преимуществ. –
Этот комментарий, вероятно, является лучшим аргументом в пользу использования более одного ядра базы данных для тестирования и производства, учитывая тот проект, в котором вам нужно развернуть артефакт во многих средах. –
HSQLDB 2.1 и более поздние версии совместимы с PostgreSQL и поддерживают тип данных TEXT в этом режиме.
Согласен с @fredt. Тип данных TEXT не является стандартным типом SQL, а расширением, которое поддерживает какой-либо движок.
Чтобы включить Режим совместимости PostgreSQL используйте параметры подключения sql.syntax_pgs=true
.
Чтобы заставить 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
Для корректной работы Hibernate/JPA требуется создать таблицу PG_CLASS. Но кроме этого - довольно бесшовно.
Вы тоже пытались использовать Postgres для тестирования? Если да, то какие проблемы вы встретили? –
Да, я также использую Postgres для тестирования. Нет проблем с этим, только проблема несовместимости hsqldb – Nemanja