[英]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.