Me encuentro con el mismo problema y ninguna de las soluciones proporcionadas (realmente) me ayudó (y hay bastantes más publicaciones aquí en Stackoverflow que están estrechamente relacionadas), pero finalmente lo descubrí. Por lo tanto, pensé en compartir mis hallazgos (lo siento por la publicación un poco larga):
En mi caso convertí algunos UnitTests existentes utilizando una base de datos MySQL a HSQLDB para que la dependencia externa se pueda eliminar. Todo esto parece fácil si observas descripciones como: http://eskatos.wordpress.com/2007/10/15/unit-test-jpa-entities-with-in-memory-database/ Pero resultó ser un poco más complicado.
I experimentaron con
- versiones diferentes (como se sugiere más arriba),
- los parámetros
create
y ifexists
(ver: http://hsqldb.org/doc/2.0/guide/dbproperties-chapt.html),
- especificando diferentes credenciales de usuario (nombre de usuario = "sa", contraseña = "" es correcto),
- especificando actualizar, crear y crear-soltar como hibernate.hbm2ddl.auto (ver http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/session-configuration.html),
- el uso de diferentes tipos de DataSources: c3p0, el DBCP, ...
- ...
Pero ninguno de los que realmente hizo ninguna diferencia (los errores se diferenciaba por cierto.). Aparte del mensaje user lacks privilege or object not found
de error, el más informativo que pude conseguir fue la siguiente: SQL Error: -20, SQLState: IM001
(que se traduce como "Controlador no admite esta función") e incluso de manera más explícita encontré esto en los registros: [2012-09-24 14:50:45,796] ERROR main::org.hibernate.engine.jdbc.spi.SqlExceptionHelper.logExceptions(144) | This function is not supported
Entonces algo claramente se rompió. Resulta que mayor problema resulta ser una combinación de dos cosas: 1. Me sin mirar adecuadamente a través de la salida del registro, ya que en realidad contenía la clave 2. Una anotación errónea
En cuanto a 1:
el problema fue que la salida contiene una gran cantidad de líneas que se parecían a los siguientes (which can apparently be ignored, y hay incluso una 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
En cuanto a 2:
Entre todas esas líneas estaban ocultas las siguientes líneas, que en realidad regala lo que es el error:
[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))]
Así que la cuestión es que el BaseEntity que se define tiene una anotación errónea de la identificación:
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(nullable = false, unique = true)
private Long id;
El campo ya está identificado como una ID (es decir, como clave principal), y por lo tanto no puede tener una anotación única (y también el nullable
es superfluo). El cambio de este a:
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id")
private Long id;
y todo funciona bien :-)
No sé qué está sucediendo allí con esto en la base de datos de memoria ...: S Tal vez [fredt] (http://stackoverflow.com/users/361828/fredt) aparecerá con una buena explicación. Por si acaso, ¿qué versión de HSQLDB estás usando? –
@Pascal Estoy usando 2.0 –
Quizás intente con 1.8.1.3, solo para estar seguro. –