2010-09-27 5 views
13

Я настраиваю автономную службу Java с встроенной базой данных HSQL в базе данных.Внутренняя база данных 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 
+0

Не знаю, что там происходит с этим в базе данных памяти ...: S Может быть [fredt] (http://stackoverflow.com/users/361828/fredt) появится с хорошим объяснением. На всякий случай, какую версию HSQLDB вы используете? –

+0

@Pascal Я использую 2.0 –

+0

Возможно, попробуйте с 1.8.1.3, просто чтобы быть уверенным. –

ответ

14

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

+0

Интересно, я не знал об этих требованиях (ограничениях?) На версиях. +1 –

+1

Я столкнулся с этим вопросом после получения такой же ошибки после добавления нового столбца к сущности, столкнувшейся с зарезервированным словом SQL - 'WHEN' в этом случае. Свойства объекта не указаны в вопросе, но в моем случае добавление аннотации с экранированием (backticks) решило проблему: '' @Column (name = "' when' ")' '. Может быть, имя столбца просто отстой :-) – penfold

+0

В настоящее время поддерживает hibernate поддержку HSQLDB 2.2.8? – Bas

0

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

< имя свойства = "connection.url"> JDBC: HSQLDB: Файл: C: \ Hibernate-пример \ базы данных \ MYDB; выключение = истина </недвижимости>

+0

Спасибо, но я использую базу данных, хранящуюся в памяти, а не в файле. –

0

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

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

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

И EclipseLink должно быть

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

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

12

Я столкнулся с той же проблемой, и ни один из предоставленных решений (на самом деле) не помог мне (и здесь есть еще несколько сообщений о 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. указав различные учетные данные (имя пользователя = "са", пароль = ""),
  4. уточнение изменений, создание и создание-падение как hibernate.hbm2ddl.auto (см. http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/session-configuration.html),
  5. с использованием различных типов DataSources: C3P0, ДБКП, ...
  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. Ошибочных аннотаций

Относно 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; 

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

+1

Вопрос об ошибочной аннотации id для id также помог мне в моем случае. Большое спасибо за обмен. Швы SQLserver будут менее строгими в отношении ошибочных (или избыточных) аннотаций ... –

+0

Изменение типа GenerationType от AUTO до IDENTITY работает для меня – dalvarezmartinez1

0

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

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

call next value for EXAMPLE_SCHEMA.TEST_SEQ 
4

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

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

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

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

А потом тесты снова работали.

+0

Спасибо! Это фиксировало проблему в моем случае. –

+0

Спасибо! он работал на меня ... На самом деле я использовал @Column (columnDefinition = "text") – Darshan

0

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

Смежные вопросы