Я столкнулся с той же проблемой, и ни одно из предложенных решений (действительно) не помогло мне (и здесь есть довольно много постов в 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), - указание различных учетных данных пользователя (имя пользователя = "sa", пароль = "" является правильным),
- указание обновления, создания и создания-удаления как hibernate.hbm2ddl.auto (см. http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/session-configuration.html),
- с использованием различных типов источников данных: c3p0, dbcp, ...
- ...
Но ни один из них действительно не имел никакого значения (ошибки отличались, между прочим,.). Помимо сообщения об ошибке 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.Ошибочная аннотация
Regardiнг 1:
Проблема заключалась в том, что вывод содержит огромное количество строк, которые выглядели следующим образом (, которые, по-видимому, можно игнорировать , и есть даже билет для 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
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(nullable = false, unique = true)
private Long id;
Поле уже идентифицировано как идентификатор (то есть как основнойключ), и, следовательно, не может иметь уникальную аннотацию (а также nullable
является излишним).Изменив это на:
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id")
private Long id;
и все работает нормально: -)