【问题标题】:Internal HSQL database complains about privileges内部 HSQL 数据库抱怨特权
【发布时间】:2011-04-17 20:32:26
【问题描述】:

我正在使用进程中的内存 HSQL 数据库设置独立的 Java 服务。

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

【问题讨论】:

  • 不知道内存数据库中发生了什么... :S 也许fredt 会给出一个很好的解释。以防万一,您使用的是哪个版本的 HSQLDB?
  • 也许可以试试 1.8.1.3,只是为了确定。

标签: java database jpa persistence hsqldb


【解决方案1】:

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

【讨论】:

  • 有趣的是,我不知道版本的这些要求(限制?)。 +1
  • 在将新列添加到与 SQL 保留字冲突的实体(在本例中为 WHEN)后,我遇到了同样的错误后遇到了这个问题。实体属性未在问题中列出,但在我的情况下,添加带有转义(反引号)的注释解决了问题:@Column( name = "`when`" )。也许列名很烂:-)
  • hibernate 目前是否支持 HSQLDB 2.2.8?
  • 最新的 Hibernate 支持 HSQLDB 2.2.8。 USER可以作为表名使用,但是作为列名使用时必须加引号,否则返回CURRENT_USER的值。
【解决方案2】:

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

jdbc:hsqldb:file:C:\Hibernate-example\database\mydb;shutdown=true

【讨论】:

  • 谢谢,但我使用的是存储在内存中的数据库,而不是文件。
【解决方案3】:

根据上面的帖子,我将 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】:

    当我遇到这个错误时,我意识到我在 persistence.xml 中使用了错误的提供程序类

    对于 Hibernate 应该是

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

    对于 EclipseLink 应该是

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

    您还应该注意persistence.xml 和创建Persistence.createEntityManagerFactory("name") 时使用的名称不同

    【讨论】:

      【解决方案5】:

      我遇到了同样的问题,并且提供的解决方案(真的)都没有帮助我(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. 指定不同的用户凭据(用户名=“sa”,密码=“”是正确的),
      4. 将 update、create 和 create-drop 指定为 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.一个错误的注释

      关于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;
      

      一切正常:-)

      【讨论】:

      • id 的错误 id 注释问题对我的情况也有帮助。非常感谢分享。 SQLserver 接缝对错误(或冗余)注释不那么严格......
      • 将 GenerationType 从 AUTO 更改为 IDENTITY 对我有用
      【解决方案6】:

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

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

      call next value for EXAMPLE_SCHEMA.TEST_SEQ
      

      【讨论】:

        【解决方案7】:

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

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

        HSQL好像不支持这个,我把定义改成这样:

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

        然后测试又开始了。

        【讨论】:

        • 谢谢!!它对我有用...实际上我使用了@Column(columnDefinition = "text")
        【解决方案8】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-09-17
          • 1970-01-01
          • 2020-04-28
          • 1970-01-01
          相关资源
          最近更新 更多