Внутренняя база данных HSQL жалуется на привилегии - PullRequest
13 голосов
/ 27 сентября 2010

Я настраиваю автономную службу Java с незавершенной базой данных HSQL в памяти.

persistence.xml

<persistence xmlns="http://java.sun.com/xml/ns/persistence"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
 version="2.0">

 <persistence-unit name="manager">

 <class>tr.silvercar.data.entities.User</class>
 <properties>
 <property name="javax.persistence.jdbc.driver" value="org.hsqldb.jdbcDriver" />
 <property name="javax.persistence.jdbc.user" value="sa" />
 <property name="javax.persistence.jdbc.password" value="" />
 <property name="javax.persistence.jdbc.url" value="jdbc:hsqldb:mem:testdb" />

 <property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect" />
 <property name="hibernate.max_fetch_depth" value="3" />

 <!-- cache configuration -->
<!-- 
 <property name="hibernate.ejb.classcache.org.hibernate.ejb.test.Item"
  value="read-write" />
 <property
  name="hibernate.ejb.collectioncache.org.hibernate.ejb.test.Item.distributors"
  value="read-write, RegionName" />
 -->
 </properties>

 </persistence-unit>

</persistence>

Код

  emf = Persistence.createEntityManagerFactory("manager");

  User newUser = new User();
  newUser.setName("Testgebruiker");
  newUser.setCredits(100);

  System.out.println("Inserting user");
  EntityManager em = emf.createEntityManager();
  em.persist(newUser);
  em.close();

  System.out.println("Getting user");
  em = emf.createEntityManager();
  User u = (User) em.createQuery("SELECT u FROM User u").getSingleResult();
  em.close();
  System.out.println(u);

Мне кажется, что поскольку база данных находится в памяти, а Hibernate должен генерировать таблицы, мне больше ничего не нужно делать. Однако после вызова getSingleResult я получаю исключение:

org.hsqldb.HsqlException: user lacks privilege or object not found: USER

Ответы [ 8 ]

14 голосов
/ 28 сентября 2010

Вам необходимо использовать Hibernate 3.5.6 или новее вместе с HSQLDB версии 2.2.x или новее.В противном случае старые фляги Hibernte работают с HSQLDB 1.8.x.Название таблицы не является проблемой.Я разработал диалект и запускаю тесты Hibernate для этой версии, но Паскаль знает об использовании Hibernate гораздо больше, чем я, и помог многим здесь.

13 голосов
/ 25 сентября 2012

Я столкнулся с той же проблемой, и ни одно из предложенных решений (действительно) не помогло мне (и здесь есть довольно много постов в Stackoverflow, которые тесно связаны), но я наконец-то понял это.Поэтому я решил поделиться своими выводами (извините за немного длинный пост):

В моем случае я преобразовал некоторые существующие UnitTests с использованием базы данных MySQL в HSQLDB, чтобы можно было удалить внешнюю зависимость.Все это выглядит довольно просто, если вы посмотрите на описания вроде: http://eskatos.wordpress.com/2007/10/15/unit-test-jpa-entities-with-in-memory-database/ Но оказалось, что это немного сложнее.

Я экспериментировал с

  1. различными версиями (как предложено выше),
  2. create и ifexists параметрами (см .: http://hsqldb.org/doc/2.0/guide/dbproperties-chapt.html),
  3. указание различных учетных данных пользователя (имя пользователя = "sa", пароль = "" является правильным),
  4. указание обновления, создания и создания-удаления как hibernate.hbm2ddl.auto (см. http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/session-configuration.html),
  5. с использованием различных типов источников данных: c3p0, dbcp, ...
  6. ...

Но ни один из них действительно не имел никакого значения (ошибки отличались, между прочим,.). Помимо сообщения об ошибке 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;

и все работает нормально: -)

4 голосов
/ 29 июля 2013

Я столкнулся с подобной проблемой, но в моем случае проблема возникла из-за определений столбцов. Я использовал определения MySQL следующим образом:

@Id
@GeneratedValue
@Column(columnDefinition = "INT(11)")
private long id;

Похоже, что это не поддерживается HSQL, и я изменил определение следующим образом:

@Id
@GeneratedValue
@Column(columnDefinition = "INTEGER")
private long id;

И тогда тесты снова заработали.

1 голос
/ 06 декабря 2010

Как указано выше, я использовал Hibernate 3.5.6 вместе с HSQLDB 2.0.1, но он по-прежнему выдавал ошибку.Я также исправил URL, но не помог.Наконец изменил HQSL jar на версию 1.8.1 с http://sourceforge.net/projects/hsqldb/files/hsqldb/hsqldb_1_8_1/hsqldb_1_8_1_3.zip/download и все заработало

0 голосов
/ 06 апреля 2017

HSQL использует не longtext, а тип LONGVARCHAR. Его изменение решило аналогичную проблему для меня, когда он жаловался на требуемые привилегии.

0 голосов
/ 19 июня 2013

Попробуйте явно указать имя SCHEMA для таблицы / последовательности, на которую ссылаются.

Я только что столкнулся с подобной проблемой, когда моя последовательность не была распознана, а затем я понял, что в своей аннотации Hibernate @SequenceGenerator я не добавлял схему к последовательности ref.

call next value for EXAMPLE_SCHEMA.TEST_SEQ
0 голосов
/ 04 июня 2012

Когда у меня появилась эта ошибка, я понял, что использовал неправильный класс провайдера в persistence.xml

Для Hibernate это должно быть

<provider>org.hibernate.ejb.HibernatePersistence</provider>

А для EclipseLink это должно быть

<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>

Следует также отметить, что в persistence.xml и при создании Persistence.createEntityManagerFactory("name")

используются разные имена
0 голосов
/ 28 сентября 2010

Я тоже столкнулся с такой же ошибкой. Это было решено, когда я указал абсолютный путь к файлу скрипта в "connection.url".

jdbc: hsqldb: файл: C: \ Hibernate-example \ database \ mydb; shutdown = true

...