[英]ActiveJDBC: save() generates insert only for auto-generated primary key?
我最近开始使用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而不是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
类中的save()
方法,并看到了这段代码:
if (getId() == null) {
result = insert();
} else {
result = update();
}
这是否意味着id列必须为空才能生成插入? 如果是这样,那是不可接受的,因此我必须缺少一些东西。
@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();
,具体取决于您的需求。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.