2016-11-25 2 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

Как я понял из документации двойные кавычки, введите имя поля case sensentive –

+0

Это не имеет ничего общего с каркасом. Попробуйте выполнить то же самое без ActiveJDBC и устраните проблему с привилегией: INSERT INTO users (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 {} 

В принципе, вы имели следующие проблемы с вашим кодом:

  1. Определение ID колонки в двойные кавычки
  2. ID столбца должен быть определен как ИДЕНТИФИКАЦИЯ (не держите меня за ноги, я не специалист по HSQL, но работает t)
  3. Модели необходимо перезаписать @IdName("ID"), так как Active JDBC по умолчанию нижний регистр id, если вы не измените в таблице (почему нет?)

Имейте в виду, что некоторые вещи могут не работать, так как HSQL не в списке поддерживаемых баз данных.

Надеюсь, это поможет!

+0

'GENERATED BY DEFAULT AS SEQUENCE seq' отлично, но вам нужно сначала «CREATE SEQUENCE 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

Что именно мне нужно делать? Потому что я не понял –