3

我最近开始使用 ActiveJDBC。我有下表(postgresql)

CREATE TABLE users (
    id                   uuid PRIMARY KEY,
    email                text UNIQUE NOT NULL,
    password             text,
    <some more nullable columns>
    created_at           timestamp with time zone NOT NULL default (now() at time zone 'utc'),
    updated_at           timestamp with time zone
);

如您所见,主键是 uuid 类型,并且没有任何类型的自动生成值。

这是我的用户类,它为表建模:

public class User extends Model
{
    public User() {
        setId(UUID.randomUUID());  // sets value to primary key
    }
...
}

这是我尝试创建一个新行并插入它:

    User u = new User();
    System.out.println(u.saveIt());

实际上,我预计插入会失败,因为我没有为强制性电子邮件列设置任何值。但是,只是将 false 作为返回值。当我打开日志时,我看到框架生成了一个更新 sql 而不是插入:

[main] INFO org.javalite.activejdbc.DB - Query: "UPDATE users SET email = ?, ..., updated_at = ? WHERE id = ?", with parameters: <null>, <null>, <null>, <null>, <null>, <null>, <null>, <2016-01-07 17:30:46.025>, <0621fbdb-5b95-4ee7-a474-8ee9165e2982>, took: 1 milliseconds

所以我查看了类save()里面的方法org.javalite.activejdbc.Model,看到了这段代码:

    if (getId() == null) {
        result = insert();
    } else {
        result = update();
    }

这是否意味着 id 列必须为空才能生成插入?如果这是真的,这是不可接受的,所以我一定遗漏了一些东西。

4

1 回答 1

4

@sharonbn,请参阅此文档页面:http: //javalite.io/surrogate_primary_keys。ActiveJDBC 依赖于自动生成的 ID。如果 ID == null,则框架假定这是一条新记录,并生成 INSERT 语句。如果不为空,则假定记录已存在,并生成 UPDATE。

在您的情况下,您将需要显式调用user.insert()而不是user.saveIt(). 在开发人员想要控制 ID 管理的情况下,这是一种“专家”模式。此外,该方法user.update()是私有的。因此,要插入新记录,您将调用

user.insert();

和更新:

user.save(); // or: user.saveIt();

,取决于你想要什么。

于 2016-01-07T21:19:26.330 回答