【问题标题】:Cannot insert object to database with ActiveJDBC无法使用 ActiveJDBC 将对象插入数据库
【发布时间】:2013-06-10 04:47:47
【问题描述】:

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

Base.open("org.hsqldb.jdbc.JDBCDriver", "jdbc:hsqldb:file:queen-db;shutdown=true;hsqldb.write_delay=false;", "sa", "");

    User e = new User();
    e.set("id", 1);
    e.set("nickname", "Superman");
    e.set("first_name", "John");
    e.set("last_name", "Doe");
    e.saveIt();

    User e1 = new User();
    e1.set("id", 2);
    e1.set("nickname", "Superman2");
    e1.set("first_name", "John2");
    e1.set("last_name", "Doe2");
    e1.saveIt();

    List<User> users = User.findAll();

    for (User user : users) {
        System.out.println(user.get("id") + " " + user.get("nickname") + " " + user.get("first_name") + " " + user.get("last_name"));
    }

但没有输出,数据库中也没有信息。 这是我的 FlyWay 迁移:

CREATE TABLE users (
    id INT NOT NULL,
    nickname VARCHAR(100) NOT NULL,
    first_name VARCHAR(100) NOT NULL,
    last_name VARCHAR(100) NOT NULL
);

怎么了?

添加:设置 Log4J,收到消息:

0    [main] INFO  hsqldb.db.HSQLDB3F3E800675.ENGINE  - checkpointClose start
35   [main] INFO  hsqldb.db.HSQLDB3F3E800675.ENGINE  - checkpointClose end

更新:这里是日志输出

0    [main] INFO  hsqldb.db.HSQLDB3F42F00869.ENGINE  - checkpointClose start
37   [main] INFO  hsqldb.db.HSQLDB3F42F00869.ENGINE  - checkpointClose end
68   [main] INFO  org.javalite.activejdbc.ConnectionsAccess  - Attaching connection: org.hsqldb.jdbc.JDBCConnection@41a78257
68   [main] INFO  org.javalite.activejdbc.ConnectionsAccess  - Opened connection:org.hsqldb.jdbc.JDBCConnection@41a78257 named: default on thread: Thread[main,5,main]
97   [main] INFO  org.javalite.activejdbc.Configuration  - Load models from: jar:file:/Users/dmitrysavchenko/projects/hive-queen/target/queen-jar-with-dependencies.jar!/activejdbc_models.properties
116  [main] INFO  org.javalite.activejdbc.Registry  - Registered model: class org.hive.models.User
285  [main] INFO  org.javalite.activejdbc.Registry  - Fetched metadata for table: users
302  [main] INFO  org.javalite.activejdbc.DB  - Query: "UPDATE users SET first_name= ?, nickname= ?, last_name= ? where id = ?", with parameters: <John>, <Superman>, <Doe>, <1>, took: 11 milliseconds
305  [main] INFO  org.javalite.activejdbc.DB  - Query: "UPDATE users SET first_name= ?, nickname= ?, last_name= ? where id = ?", with parameters: <John2>, <Superman2>, <Doe2>, <2>, took: 0 milliseconds
315  [main] INFO  org.javalite.activejdbc.LazyList  - Query: "SELECT * FROM users", took: 4 milliseconds

看起来执行了错误的操作。怎么了?

【问题讨论】:

  • 这些消息的时间戳是多少?
  • 通过添加系统属性-Dactivejdbc.log启用日志记录,然后它将输出每个生成的SQL语句发送到DB。
  • 只想指出,ActiveJDBC 支持以下数据库:MySQL、PostgreSQL、Oracle、H2 和 MS SQLServer
  • 没有 HSQLDB 支持? JDBC支持
  • 如果您使用的是最新版本的 HSQLDB,我会说您的 JDBC 驱动程序类看起来不对。我的是“org.hsqldb.jdbcDriver”。此外,请确保驱动程序在您的类路径中可用。在这方面,在服务器模式下使用 HSQLDB 实际上要简单一些……您至少总是知道它是否配置正确,否则它将无法启动。

标签: java hsqldb activejdbc


【解决方案1】:

我的问题在于 ID 属性。默认 ActiveJDBC 行为如下:如果 ID 属性为空,则创建记录,如果有任何值,则更新记录。就我而言,我刚刚使用了以下代码:

User e = new User();
e.set("id", 1);
e.set("nickname", "Superman");
e.set("first_name", "John");
e.set("last_name", "Doe");
e.insert();

重要! insert 不适用于旧版本,请使用 1.4.7 或更高版本

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-10
    • 1970-01-01
    • 2019-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多