ActiveJDBC:save() 只为自动生成的主键生成插入?
ActiveJDBC: save() generates insert only for auto-generated primary key?
我最近开始使用 ActiveJDBC。我有以下 table (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 类型,没有任何类型的自动生成值。
这是我的用户 class,它模仿 table :
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 作为 return 值。当我打开日志记录时,我看到框架生成了一个更新 sql 而不是 insert:
[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
class里面的save()
方法,看到了这段代码:
if (getId() == null) {
result = insert();
} else {
result = update();
}
这是否意味着 id 列必须为空才能生成插入?如果这是真的,那就是 unacceptable,所以我一定是遗漏了什么。
@sharonbn,请参阅此文档页面:http://javalite.io/surrogate_primary_keys。
ActiveJDBC 依赖于自动生成的 ID。如果 ID == null,框架假定这是一条新记录,并生成 INSERT 语句。如果是non-null,则认为记录已经存在,产生UPDATE。
在您的情况下,您需要显式调用 user.insert()
而不是 user.saveIt()
。当开发人员想要控制 ID 管理时,这是一种 'expert' 模式。此外,方法 user.update()
是私有的。所以你要插入一条新记录,你会调用
user.insert();
以及更新:
user.save();
// or:
user.saveIt();
,看你想要什么。
我最近开始使用 ActiveJDBC。我有以下 table (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 类型,没有任何类型的自动生成值。
这是我的用户 class,它模仿 table :
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 作为 return 值。当我打开日志记录时,我看到框架生成了一个更新 sql 而不是 insert:
[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
class里面的save()
方法,看到了这段代码:
if (getId() == null) {
result = insert();
} else {
result = update();
}
这是否意味着 id 列必须为空才能生成插入?如果这是真的,那就是 unacceptable,所以我一定是遗漏了什么。
@sharonbn,请参阅此文档页面:http://javalite.io/surrogate_primary_keys。 ActiveJDBC 依赖于自动生成的 ID。如果 ID == null,框架假定这是一条新记录,并生成 INSERT 语句。如果是non-null,则认为记录已经存在,产生UPDATE。
在您的情况下,您需要显式调用 user.insert()
而不是 user.saveIt()
。当开发人员想要控制 ID 管理时,这是一种 'expert' 模式。此外,方法 user.update()
是私有的。所以你要插入一条新记录,你会调用
user.insert();
以及更新:
user.save();
// or:
user.saveIt();
,看你想要什么。