hsqldb仅在基于内存的数据库中报告"用户缺少权限或对象未找到"

Sun*_*Wei 5 spring-mvc hsqldb mybatis

环境:Spring(3.2.3.RELEASE)+ MyBatis(3.2.2)+ HSQL(2.3.0)

<resultMap id="hashMapResult" type="java.util.HashMap">
    <result property="key" column="key" />
    <result property="value" column="value" />
</resultMap>

<select id="getSettings" resultMap="hashMapResult">
    SELECT "KEY","VALUE" from "PUBLIC"."SETTINGS";
</select>

     create table "SETTINGS" (
    "KEY" varchar(255) not null,
    "VALUE" varchar(512) not null,
    CONSTRAINT SETTINGS_KEY_UNIQUE UNIQUE("KEY")
     );
Run Code Online (Sandbox Code Playgroud)

URL:jdbc:hsqldb:mem:mydb; sql.syntax_mys = true; shutdown = true;

使用内存数据库时,出现以下错误:

Caused by: org.hsqldb.HsqlException: user lacks privilege or object not found: SETTINGS
at org.hsqldb.error.Error.error(Unknown Source) ~[hsqldb-2.3.0.jar:2.3.0]
at org.hsqldb.error.Error.error(Unknown Source) ~[hsqldb-2.3.0.jar:2.3.0]
at org.hsqldb.SchemaManager.getTable(Unknown Source) ~[hsqldb-2.3.0.jar:2.3.0]
at org.hsqldb.ParserDQL.readTableName(Unknown Source) ~[hsqldb-2.3.0.jar:2.3.0]
at org.hsqldb.ParserDQL.readTableOrSubquery(Unknown Source) ~[hsqldb-2.3.0.jar:2.3.0]
at org.hsqldb.ParserDQL.XreadTableReference(Unknown Source) ~[hsqldb-2.3.0.jar:2.3.0]
Run Code Online (Sandbox Code Playgroud)

但是当使用基于文件的数据库时jdbc:hsqldb:file:mydb; sql.syntax_mys = true; shutdown = true; 没有任何错误.

我使用Spring的EmbeddedDatabaseFactory来初始化数据库:

    try {
        EmbeddedDatabaseFactory dbFactory = new EmbeddedDatabaseFactory();
        DatabaseConfig dbConfig = appConfig.getDbConfig();
        ResourceDatabasePopulator populator = new ResourceDatabasePopulator();
        populator.setContinueOnError(false);
        populator.setIgnoreFailedDrops(false);
        DefaultResourceLoader resourceLoader = new DefaultResourceLoader();
        populator.addScript(resourceLoader.getResource(dbConfig
                .getSqlSchemeFile()));
        populator.addScript(resourceLoader.getResource(dbConfig
                .getSqlDataFile()));
        dbFactory.setDatabasePopulator(populator);
        dbFactory.setDatabaseName(dbConfig.getName());
        dbFactory.setDatabaseConfigurer(new HSQLConfigurer(dbConfig));
        return dbFactory.getDatabase();
    } catch (Exception e) {
        logger.error("dataSource error", e); //$NON-NLS-1$

        return null;
    }
Run Code Online (Sandbox Code Playgroud)

谁知道为什么?

fre*_*edt 5

在此上下文中不应使用shutdown = true.似乎连接已关闭且数据库已关闭,这意味着内存数据库不再存在.

您还应该避免使用VALUE作为列名.这是一个关键字.

  • 删除"shutdown = true"解决了我的问题.谢谢. (2认同)