Подтвердить что ты не робот

Внутренняя база данных HSQL жалуется на привилегии

Я настраиваю автономный 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
4b9b3361

Ответ 1

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

Ответ 2

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

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

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

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

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

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

Ответ 3

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

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

Это, похоже, не поддерживается HSQL, и я изменил определение на это:

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

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

Ответ 5

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

< свойство name= "connection.url" > jdbc: hsqldb: файл: C:\Hibernate-example\database\mydb; shutdown = true </Недвижимость >

Ответ 6

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

Для спящего режима это должно быть

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

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

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

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

Ответ 7

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

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

call next value for EXAMPLE_SCHEMA.TEST_SEQ

Ответ 8

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