无法使用 ActiveJDBC 将对象插入到 HSQLDB
Cannot insert object to HSQLDB with ActiveJDBC
我正在尝试将 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
);
User.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
我认为插入查询中的小写问题。我该如何解决这个问题?
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
);
在谷歌搜索此 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();
如您所见,创建 table 的代码有点不同,尤其是在 ID 列周围。
模型看起来像这样:
@IdName("ID")
public class Person extends Model {}
基本上,您的代码存在以下问题:
- 用双引号定义 ID 列
- ID 列需要定义为 IDENTITY(不要坐视不理,我不是 HSQL 专家,但是行得通)
- 模型需要覆盖
@IdName("ID")
,因为 ActiveJDBC 默认为小写 id
,除非您在 table 中更改它(为什么不呢?)
请记住,有些事情可能不起作用,因为 HSQL 不在支持的数据库列表中。
希望对您有所帮助!
我正在尝试将 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
);
User.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
我认为插入查询中的小写问题。我该如何解决这个问题?
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
);
在谷歌搜索此 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();
如您所见,创建 table 的代码有点不同,尤其是在 ID 列周围。
模型看起来像这样:
@IdName("ID")
public class Person extends Model {}
基本上,您的代码存在以下问题:
- 用双引号定义 ID 列
- ID 列需要定义为 IDENTITY(不要坐视不理,我不是 HSQL 专家,但是行得通)
- 模型需要覆盖
@IdName("ID")
,因为 ActiveJDBC 默认为小写id
,除非您在 table 中更改它(为什么不呢?)
请记住,有些事情可能不起作用,因为 HSQL 不在支持的数据库列表中。
希望对您有所帮助!