Я столкнулся с той же проблемой, и ни один из предоставленных решений (на самом деле) не помог мне (и здесь есть еще несколько сообщений о Stackoverflow, которые тесно связаны), но я, наконец, понял это. Поэтому я решил поделиться своими выводами (извините за немного длинный пост):
В моем случае я преобразовал некоторые существующие UnitTests, используя базу данных MySQL, в HSQLDB, чтобы можно было удалить внешнюю зависимость. Все это выглядит легко, если вы посмотрите на такие описания, как: http://eskatos.wordpress.com/2007/10/15/unit-test-jpa-entities-with-in-memory-database/ Но это оказалось немного сложнее.
Я экспериментировал с
- различных версий (как уже говорилось выше),
- в
create
и ifexists
параметры (см: http://hsqldb.org/doc/2.0/guide/dbproperties-chapt.html)
- указав различные учетные данные (имя пользователя = "са", пароль = ""),
- уточнение изменений, создание и создание-падение как hibernate.hbm2ddl.auto (см. http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/session-configuration.html),
- с использованием различных типов DataSources: C3P0, ДБКП, ...
- ...
Но ни один из тех, кто действительно сделал никакой разницы (ошибки не отличались кстати.). Помимо сообщения о user lacks privilege or object not found
ошибок, наиболее информативный я мог бы получить было следующее: SQL Error: -20, SQLState: IM001
(что переводится как «Драйвер не поддерживает эту функцию») и еще более явным образом я нашел это в журналах: [2012-09-24 14:50:45,796] ERROR main::org.hibernate.engine.jdbc.spi.SqlExceptionHelper.logExceptions(144) | This function is not supported
Так что что-то ясно было сломано. Получается, что самая большая проблема оказывается сочетание двух вещей: 1. Я не правильно просматривал выход журнала, так как он на самом деле содержится ключ 2. Ошибочных аннотаций
Относно 1:
проблема в том, что вывод содержит огромное количество строк, которые выглядели как следующий (which can apparently be ignored, и есть даже ticket for H2):
[2012-09-25 10:07:13,453] ERROR main::org.hibernate.tool.hbm2ddl.SchemaExport.perform(426) | HHH000389: Unsuccessful: alter table SimpleSubscription drop constraint FKAD76A00F168752B2
[2012-09-25 10:07:13,453] ERROR main::org.hibernate.tool.hbm2ddl.SchemaExport.perform(427) | user lacks privilege or object not found: PUBLIC.SIMPLESUBSCRIPTION
Hibernate: alter table SimpleSubscriptionChange drop constraint FKB3B8189FFC3506ED
[2012-09-25 10:07:13,453] ERROR main::org.hibernate.tool.hbm2ddl.SchemaExport.perform(426) | HHH000389: Unsuccessful: alter table SimpleSubscriptionChange drop constraint FKB3B8189FFC3506ED
[2012-09-25 10:07:13,453] ERROR main::org.hibernate.tool.hbm2ddl.SchemaExport.perform(427) | user lacks privilege or object not found: PUBLIC.SIMPLESUBSCRIPTIONCHANGE
Hibernate: alter table SimpleSubscriptionChange_languages drop constraint FK5A45F07BFC21A8E6
Что касается 2:
Между всеми этими линиями были скрыты следующие строки, которые на самом деле нарушает то, что ошибка:
[2012-09-25 10:07:13,468] ERROR main::org.hibernate.tool.hbm2ddl.SchemaExport.perform(426) | HHH000389: Unsuccessful: create table Rule (id bigint generated by default as identity (start with 1), creationTime timestamp not null, deleted BIT not null, lastUpdateTime timestamp, version integer not null, fetcher varchar(255), hash integer not null, primary key (id), unique (id))
[2012-09-25 10:07:13,468] ERROR main::org.hibernate.tool.hbm2ddl.SchemaExport.perform(427) | a UNIQUE constraint already exists on the set of columns in statement [create table Rule (id bigint generated by default as identity (start with 1), creationTime timestamp not null, deleted BIT not null, lastUpdateTime timestamp, version integer not null, fetcher varchar(255), hash integer not null, primary key (id), unique (id))]
Так что вопрос в том, что BaseEntity, который определен имеет ошибочный аннотацию для id:
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(nullable = false, unique = true)
private Long id;
Поле уже идентифицировано как идентификатор (т. е. как первичный ключ) и поэтому не может иметь уникальную аннотацию (а также nullable
является излишним). Изменение это:
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id")
private Long id;
и все работает отлично :-)
Не знаю, что там происходит с этим в базе данных памяти ...: S Может быть [fredt] (http://stackoverflow.com/users/361828/fredt) появится с хорошим объяснением. На всякий случай, какую версию HSQLDB вы используете? –
@Pascal Я использую 2.0 –
Возможно, попробуйте с 1.8.1.3, просто чтобы быть уверенным. –