web-dev-qa-db-fra.com

La base de données HSQL interne se plaint des privilèges

Je suis en train de configurer un service Java autonome avec une base de données HSQL en cours de traitement et en mémoire.

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>

Code

  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);

Il me semble que puisque la base de données est en mémoire et qu'Hibernate devrait générer des tables, je n'ai pas besoin de faire autre chose. Cependant, en appelant getSingleResult j'obtiens l'exception:

org.hsqldb.HsqlException: user lacks privilege or object not found: USER
13
Bart van Heukelom

Vous devez utiliser Hibernate 3.5.6 ou version ultérieure, ainsi que HSQLDB version 2.2.x ou ultérieure. Sinon, les anciens bocaux Hibernte fonctionnent avec HSQLDB 1.8.x. Le nom de la table n'est pas un problème. J'ai développé le dialecte et exécuté les tests Hibernate pour cette version, mais Pascal en sait beaucoup plus sur l'utilisation de Hibernate que moi et a aidé beaucoup de gens ici.

14
fredt

Je rencontre le même problème et aucune des solutions fournies (vraiment) ne m’a aidé (et il y a quelques autres articles ici sur Stackoverflow qui sont étroitement liés), mais j’ai finalement trouvé la solution. Par conséquent, je pensais partager mes découvertes (désolé pour le post un peu long):

Dans mon cas, j'ai converti des tests unitaires existants utilisant une base de données MySQL en HSQLDB afin de supprimer la dépendance externe. Tout cela a l'air facile si vous regardez des descriptions telles que: http://eskatos.wordpress.com/2007/10/15/unit-test-jpa-entities-with-in-memory-database/ Mais il s'est avéré être un peu plus délicat.

J'ai expérimenté

  1. différentes versions (comme suggéré ci-dessus),
  2. les paramètres create et ifexists (voir: http://hsqldb.org/doc/2.0/guide/dbproperties-chapt.html ),
  3. en spécifiant différentes informations d'identification de l'utilisateur (nom d'utilisateur = "sa", mot de passe = "" est correct),
  4. en spécifiant update, create et create-drop as hibernate.hbm2ddl.auto (voir http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/session-configuration.html ),
  5. en utilisant différents types de DataSources: c3p0, dbcp, ...
  6. ...

Mais aucune de celles-ci n'a vraiment fait de différence (les erreurs étaient d'ailleurs différentes). Mis à part le message d'erreur user lacks privilege or object not found, le plus informatif que j'ai pu obtenir est le suivant: SQL Error: -20, SQLState: IM001 (qui signifie "Le pilote ne prend pas cette fonction en charge"). Et plus explicitement encore, je l'ai trouvé dans les journaux: [2012-09-24 14:50:45,796] ERROR main::org.hibernate.engine.jdbc.spi.SqlExceptionHelper.logExceptions(144) | This function is not supported

Donc, clairement quelque chose était cassé. Il se trouve que le problème le plus important s'avère être une combinaison de deux choses: 1. Je ne regarde pas correctement dans la sortie du journal, car elle contenait en fait l'indice 2. Une annotation erronée

Concernant 1:

Le problème était que la sortie contenait une quantité énorme de lignes qui ressemblaient à ce qui suit ( qui peut apparemment être ignoré , et il existe même un ticket pour 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

Concernant 2:

Entre toutes ces lignes étaient cachées les lignes suivantes, ce qui indique en réalité quelle est l'erreur:

[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))]

Le problème est donc que la BaseEntity définie comporte une annotation erronée pour l'id:

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(nullable = false, unique = true)
private Long id;

Le champ est déjà identifié en tant qu’ID (c’est-à-dire en tant que clé primaire) et ne peut donc pas avoir une annotation unique (et la nullable est en quelque sorte superflue). La modification de ce à:

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id")
private Long id;

et tout fonctionne bien :-)

13
Maze

J'ai rencontré un problème similaire, mais dans mon cas, le problème est dû aux définitions de colonne. J'ai utilisé les définitions de MySQL de cette manière:

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

Cela ne semble pas être supporté par HSQL, et j'ai changé la définition en ceci:

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

Et puis les tests ont encore fonctionné.

4
Stig Runar Vangen

Selon le post ci-dessus, j'utilisais Hibernate 3.5.6 avec HSQLDB 2.0.1, mais l'erreur était toujours générée. J'ai également corrigé l'URL mais d'aucune aide. Enfin changé jar HQSL à la version 1.8.1 à partir de http://sourceforge.net/projects/hsqldb/files/hsqldb/hsqldb_1_8_1/hsqldb_1_8_1_3.Zip/download et cela a fonctionné

1
Bipin Kesapur

Essayez de spécifier explicitement le nom SCHEMA de la table/séquence référencée.

Je venais de faire face à un problème similaire dans lequel ma séquence n'était pas reconnue, puis je me suis rendu compte que, dans mon annotation Hibernate @SequenceGenerator, je ne préfixais pas le schéma à la séquence ref.

call next value for EXAMPLE_SCHEMA.TEST_SEQ
0
Tarun

HSQL n'utilise pas le type longtext mais le type LONGVARCHAR. Changer cela a résolu un problème similaire pour moi, où il s'est plaint des privilèges requis.

0
Alexander Pacha

Quand j'ai eu cette erreur, j'ai réalisé que j'utilisais la mauvaise classe de fournisseur dans persistence.xml

Pour Hibernate, il devrait être

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

Et pour EclipseLink, cela devrait être

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

Notez également que différents noms sont utilisés dans persistence.xml et lors de la création de Persistence.createEntityManagerFactory("name").

0
Vivek

Moi aussi j'ai fait face à la même erreur. Il a été résolu quand j'ai donné le chemin absolu du fichier de script dans "connection.url".

<property name = "connection.url"> jdbc: hsqldb: fichier: C:\exemple Hibernate\base de données\mydb; shutdown = true </ propriété>

0
upog