ActiveJDBC:save()仅为自动生成的主键生成插入语句吗?

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

我看了一下org.javalite.activejdbc.Model类中的save()方法,并看到了以下代码:

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

这是否意味着必须为空才能生成插入?如果是这样,那就无法接受了,所以我一定漏掉了什么。

如果更新语句仅设计用于保存持久化对象,则不是问题。 - Roman C
你是指什么是“只有持久化对象”吗?是指已经存在于数据库中的对象吗?但这不是文档所说的。 - Sharon Ben Asher
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(); // 或者: user.saveIt();

取决于您想要什么。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接