2010-11-18 2 views
9

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

Может ли кто-нибудь помочь в решении этой проблемы?Hibernate postgresql/hsqldb Проблема несовместимости столбца TEXT

+0

Вы тоже пытались использовать Postgres для тестирования? Если да, то какие проблемы вы встретили? –

+0

Да, я также использую Postgres для тестирования. Нет проблем с этим, только проблема несовместимости hsqldb – Nemanja

ответ

10

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

@Column(length=10000) 

Это также может быть то, что вы могли бы вместо сопоставьте его с @Lob (type = LobType.CLOB)

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

+0

Да, спасибо, длина делает трюк! – Nemanja

+1

Да, это самое простое решение, но я бы предпочел использовать HSQLDB в режиме совместимости с postgres. –

-5

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

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

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

+0

Да, спасибо, я имел это в виду, и я организовал тесты, чтобы их можно было легко запустить в обеих базах данных. Но недавно у меня было это небольшое изменение, и hsqldb начал создавать проблемы. – Nemanja

+19

Да и Нет. Согласитесь, что тестовая среда ** должна быть точно такой же, как в производственной среде. Но модульные тесты - это нечто другое: использование базы данных в памяти (например, Apache Derby или HSQLDB) отлично. И еще: имеет много преимуществ. –

+0

Этот комментарий, вероятно, является лучшим аргументом в пользу использования более одного ядра базы данных для тестирования и производства, учитывая тот проект, в котором вам нужно развернуть артефакт во многих средах. –

6

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

8

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

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

2

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