内部HSQL数据库抱怨特权

时间:2010-09-27 15:48:53

标签: java database jpa persistence hsqldb

我正在建立一个独立的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 个答案:

答案 0 :(得分:14)

您需要将Hibernate 3.5.6或更高版本与HSQLDB 2.2.x或更高版本一起使用。否则,较旧的Hibernte罐可与HSQLDB 1.8.x一起使用。表的名称不是问题。 我已经开发了方言并为这个版本运行了Hibernate测试,但Pascal比我更了解Hibernate的使用情况,并且帮助了很多人。

答案 1 :(得分:13)

我遇到了同样的问题,并没有提供任何解决方案(真的)帮助了我(在Stackoverflow上有很多帖子与密切相关),但我终于明白了。因此,我认为我分享了我的发现(对于稍长的帖子感到抱歉):

在我的情况下,我使用MySQL数据库将一些现有的UnitTests转换为HSQLDB,以便可以删除外部依赖项。如果您查看以下描述,这一切看起来都很简单:http://eskatos.wordpress.com/2007/10/15/unit-test-jpa-entities-with-in-memory-database/ 但事实证明它有点棘手。

我尝试了

  1. 不同版本(如上所述),
  2. createifexists参数(参见:http://hsqldb.org/doc/2.0/guide/dbproperties-chapt.html),
  3. 指定不同的用户凭据(用户名=&#34; sa&#34;,密码=&#34;&#34;是正确的),
  4. 指定update,create和create-drop为hibernate.hbm2ddl.auto(参见http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/session-configuration.html),
  5. 使用不同类型的DataSource:c3p0,dbcp,...
  6. ...
  7. 但是这些都没有真正产生任何影响(错误与btw不同)。除了user lacks privilege or object not found错误消息之外,我能得到的信息最多的是以下内容: SQL Error: -20, SQLState: IM001 (转换为&#34;驱动程序不支持此功能&#34;)甚至更明确地我在日志中发现了这一点: [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;
    

    该字段已被识别为ID(即作为主键),因此不能具有唯一的注释(并且nullable也是多余的)。将此更改为:

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

    一切正常: - )

答案 2 :(得分:4)

我遇到了类似的问题,但在我的情况下,问题是由于列定义而发生的。我用这种方式使用MySQL定义:

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

这似乎不受HSQL支持,我将定义更改为:

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

然后测试又恢复了。

答案 3 :(得分:1)

根据上面的帖子,我正在使用Hibernate 3.5.6和HSQLDB 2.0.1但它仍然抛出错误。我也纠正了网址但没有帮助。最后将HQSL jar从http://sourceforge.net/projects/hsqldb/files/hsqldb/hsqldb_1_8_1/hsqldb_1_8_1_3.zip/download更改为1.8.1版本并且工作正常

答案 4 :(得分:0)

我也遇到了同样的错误。当我在“connection.url”中给出脚本文件的绝对路径时,它得到了解决。

&LT; property name =“connection.url”&gt; jdbc:hsqldb:file:C:\ Hibernate-example \ database \ mydb; shutdown = true&lt; /性&gt;

答案 5 :(得分:0)

当我遇到此错误时,我意识到我在persistence.xml

中使用了错误的提供程序类

对于Hibernate,它应该是

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

对于EclipseLink,它应该是

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

您还应注意persistence.xml和创建Persistence.createEntityManagerFactory("name")

时使用的名称不同

答案 6 :(得分:0)

尝试显式指定所引用的表/序列的SCHEMA名称。

我刚遇到一个类似的问题,在我的序列中没有被识别,然后我意识到在我的Hibernate @SequenceGenerator注释中我没有将模式作为序列引用的前缀。

call next value for EXAMPLE_SCHEMA.TEST_SEQ

答案 7 :(得分:0)

HSQL不使用longtext,而是使用LONGVARCHAR类型。改变它为我解决了一个类似的问题,它抱怨所需的特权。