2016-11-25 60 views
0

我试图使用ActiveJDBC与HSQLDB:无法插入对象HSQLDB与ActiveJDBC

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 

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

+0

为什么创建脚本中的双引号中的ID名称是正确的? – Gimby

+0

正如我从文档理解双引号使字段名称感知 –

+0

这与框架无关。尝试在没有ActiveJDBC的情况下执行相同的操作并解决特权问题:INSERT INTO用户(first_name,last_name)VALUES(?,?)。 此外,HSQL不在受支持的数据库列表中:http://javalite.io/activejdbc#supported-databases,但大多数情况下仍然可以使用。 – ipolevoy

回答

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 {} 

基本上,你有你的代码以下问题:

  • ID列需要定义ID列用双引号

    1. 定义作为IDENTITY(不要忍受我的脚,我不是HSQL专家,但工作)
    2. 该模型需要覆盖@IdName("ID"),因为活动JDBC默认为小写id,除非你在表中(为什么不呢?)更改

    请记住,有些事情可能无法正常工作,因为HSQL是不支持的数据库列表中。

    我希望这有助于!

  • +0

    'GENERATED BY DEFAULT AS SEQUENCE seq'很好,但你需要首先创建序列seq AS INTEGER'。 – fredt

    1
    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 
    ); 
    
    +0

    它没有帮助。我有同样的错误。 –

    +1

    试试这个http://stackoverflow.com/a/36553372/7079604 –

    +0

    我到底需要做什么?因为我不明白 –