簡體   English   中英

ActiveJDBC:save()只能為自動生成的主鍵生成插入嗎?

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM