Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 内部HSQL数据库抱怨权限问题_Java_Database_Jpa_Persistence_Hsqldb - Fatal编程技术网

Java 内部HSQL数据库抱怨权限问题

Java 内部HSQL数据库抱怨权限问题,java,database,jpa,persistence,hsqldb,Java,Database,Jpa,Persistence,Hsqldb,我正在使用进程内、内存中的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/xm

我正在使用进程内、内存中的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>
在我看来,因为数据库在内存中,Hibernate应该生成表,所以我不需要做任何其他事情。但是,在调用
getSingleResult
时,我得到了异常:

org.hsqldb.HsqlException: user lacks privilege or object not found: USER

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

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


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

根据上面的帖子,我正在使用Hibernate 3.5.6和HSQLDB 2.0.1,但它仍然抛出错误。我还更正了url,但没有任何帮助。最终将HQSL jar从更改为1.8.1版本,并且它工作正常当我出现此错误时,我意识到我在
persistence.xml中使用了错误的提供程序类

对于Hibernate,它应该是

<provider>org.hibernate.ejb.HibernatePersistence</provider>
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
org.hibernate.ejb.HibernatePersistence
而对于日食来说应该是这样的

<provider>org.hibernate.ejb.HibernatePersistence</provider>
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
org.eclipse.persistence.jpa.PersistenceProvider

您还应该注意到,
persistence.xml
和创建
persistence.createEntityManagerFactory(“名称”)
时使用了不同的名称,我遇到了相同的问题,但没有一个解决方案(真的)对我有帮助(这里还有很多与Stackoverflow密切相关的帖子),但我终于明白了。因此,我想与大家分享我的发现(很抱歉这篇文章有点冗长):

在我的例子中,我使用MySQL数据库将一些现有的单元测试转换为HSQLDB,以便可以删除外部依赖关系。如果您查看以下描述,这一切看起来都很简单: 但结果是有点棘手

我尝试过

  • 不同版本(如上所述)
  • create
    ifexists
    参数(请参见:)
  • 指定不同的用户凭据(username=“sa”,password=”“正确)
  • 将更新、创建和创建拖放指定为hibernate.hbm2ddl.auto(请参阅)
  • 使用不同类型的数据源:c3p0、dbcp
  • 但这些都没有真正起到任何作用(顺便说一句,错误有所不同)。除了
    用户缺乏权限或找不到对象
    错误消息外,我能得到的信息最多的消息如下:
    SQL错误:-20,SQLState:IM001
    (翻译为“驱动程序不支持此功能”),我在日志中更明确地发现:
    [2012-09-24 14:50:45796]错误main::org.hibernate.engine.jdbc.spi.SqlExceptionHelper.logExceptions(144)|不支持此函数

    显然有东西坏了。事实证明,最大的问题是两件事的结合: 1.我没有正确地查看日志输出,因为它实际上包含了线索 2.错误的注释

    关于1:

    问题是输出包含大量的行,这些行看起来如下(,甚至还有一行):

    关于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(即主键),因此不能有唯一的注释(而且
    可空的
    有点多余)。将此更改为:

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

    一切正常:-)

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

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

    call next value for EXAMPLE_SCHEMA.TEST_SEQ
    

    我遇到了一个类似的问题,但在我的例子中,这个问题是由于列定义引起的。我是这样使用MySQL定义的:

    @Id
    @GeneratedValue
    @Column(columnDefinition = "INT(11)")
    private long id;
    
    HSQL似乎不支持这一点,我将定义更改为:

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

    然后测试又开始了。

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

    不知道内存中的数据库发生了什么…:S也许会带着一个好的解释出现。以防万一,您使用的是什么版本的HSQLDB?可以尝试使用1.8.1.3,只是为了确定。有趣的是,我不知道这些版本的要求(限制?)+1在向与SQL保留字冲突的实体添加新列后,我遇到了相同的错误,在本例中,当
    与SQL保留字冲突时,我遇到了这个问题。问题中未列出实体属性,但在我的例子中,添加带转义(反勾号)的注释解决了问题:
    @Column(name=“`when`”
    。也许列名很糟糕:-)hibernate当前支持HSQLDB2.2.8吗?最新的hibernate支持HSQLDB2.2.8。用户可以用作表名,但当它用作列名时,必须将其引用,否则它将返回当前用户的值。谢谢,但我使用的是存储在内存中的数据库,而不是文件中的数据库。id的错误id注释问题在我的情况下也有帮助。谢谢分享。SQLserver将对错误(或冗余)注释不那么严格…将GenerationType从AUTO更改为IDENTITY适用于meThanks!!这对我来说很有效…Actu