【问题标题】:Cannot insert object to HSQLDB with ActiveJDBC无法使用 ActiveJDBC 将对象插入 HSQLDB
【发布时间】:2016-11-25 15:29:58
【问题描述】:

我正在尝试将 ActiveJDBC 与 HSQLDB 一起使用:

Users.sql

CREATE TABLE users (
    "ID" INTEGER GENERATED BY DEFAULT AS SEQUENCE seq NOT NULL PRIMARY KEY,
    FIRST_NAME VARCHAR(100) NOT NULL,
    LAST_NAME VARCHAR(100) NOT NULL
);

用户.java

@IdName("ID")
public class User extends Model {....}

Main.java

User u = new User();
u.setFirstName("first_name");
u.setLastName("last_name");
u.save();

当我尝试保存新行时,出现以下异常:

org.javalite.activejdbc.DBException: java.sql.SQLSyntaxErrorException: user lacks privilege or object not found: id, Query: INSERT INTO users (first_name, last_name) VALUES (?, ?), params: first_name,last_name

我认为插入查询中的小写问题。我该如何解决这个问题?

【问题讨论】:

  • 为什么创建脚本中的ID名称是双引号?
  • 据我了解,双引号使字段名大小写有意义
  • 这与框架无关。尝试在没有 ActiveJDBC 的情况下执行相同的操作并解决权限问题:INSERT INTO users (first_name, last_name) VALUES (?, ?)。此外,HSQL 不在支持的数据库列表中:javalite.io/activejdbc#supported-databases,但大多数东西仍然可以开箱即用。
  • @ipolevoy 我执行并且请求在没有 ActiveJDBC 的情况下正常工作
  • @Nastya,您能否启用登录并查看生成的 SQL:javalite.io/logging,并添加整个堆栈跟踪

标签: java hsqldb activejdbc


【解决方案1】:

在谷歌搜索此 HSQL 异常消息后,我将这段代码放在一起,它确实有效。它使用 ActiveJDBC,适用于普通查询,也适用于检测模型:

Base.open("org.hsqldb.jdbc.JDBCDriver", "jdbc:hsqldb:file:./target/tmp/hsql-test", "sa", "");

String create = "CREATE TABLE people (\n" +
        "    ID INTEGER GENERATED BY DEFAULT AS IDENTITY (START WITH 1, INCREMENT BY 1) NOT NULL,\n" +
        "    FIRST_NAME VARCHAR(100) NOT NULL,\n" +
        "    LAST_NAME VARCHAR(100) NOT NULL\n" +
        ");";

Base.exec(create);
Base.exec("INSERT INTO people (first_name, last_name) VALUES (?, ?)", "John", "Doe");

System.out.println("===>" + Base.findAll("select * from people"));

Person p = new Person();
p.set("first_name", "Jane", "last_name", "Doe").saveIt();

System.out.println(Base.findAll("select * from people"));
System.out.println(Person.findAll());
Base.close();

如您所见,创建表的代码有些不同,尤其是在 ID 列周围。

模型如下所示:

@IdName("ID")
public class Person extends Model {}

基本上,您的代码存在以下问题:

  1. 用双引号定义 ID 列
  2. 需要将 ID 列定义为 IDENTITY(不要把我的脚放在火上,我不是 HSQL 专家,但可以)
  3. 模型需要覆盖 @IdName("ID"),因为 ActiveJDBC 默认为小写 id,除非您在表中更改它(为什么不呢?)

请记住,有些事情可能不起作用,因为 HSQL 不在支持的数据库列表中。

我希望这会有所帮助!

【讨论】:

  • GENERATED BY DEFAULT AS SEQUENCE seq 很好,但你需要先CREATE SEQUENCE seq AS INTEGER。
【解决方案2】:
CREATE TABLE users (
    ID INTEGER GENERATED BY DEFAULT AS SEQUENCE seq NOT NULL PRIMARY KEY,
    FIRST_NAME VARCHAR(100) NOT NULL,
    LAST_NAME VARCHAR(100) NOT NULL
);

【讨论】:

  • 我到底该怎么做?因为我不懂
猜你喜欢
  • 2013-06-10
  • 2013-07-05
  • 1970-01-01
  • 1970-01-01
  • 2014-12-26
  • 1970-01-01
  • 2013-01-22
  • 2011-05-30
  • 2012-11-14
相关资源
最近更新 更多