我在Java中執行我的項目(後端)。我不想改用Clojure(還沒有)。Java中的Datomic「update」
Datomic然而看起來很有趣和它聲明它有一個Java API,但我仍然有一些開放的問題,最重要的是這個。
爲了舉例說明,假設我們有一個具有業務屬性名稱,電子郵件和電話的客戶實體。因此,在Java中,我們有這樣的事:
public class Customer {
private Long id;
private String name;
private String email;
private String phone;
private Long version; // ? - see 4. below
// getters, setter, toString, hashCode, equals, business logic, etc.
}
的Datomic架構聲明相應的屬性:客戶/名稱,:客戶/電子郵件:客戶/電話等
有一個 「編輯客戶」表格暴露了用戶改變的3個業務屬性。假設我更改名稱和電子郵件並保存表單。
現在,我應該怎麼做才能將更改保存到Datomic中?我如何構建交易?
Datomic提供的示例過於簡單,CompareAndSwap示例最接近但根本沒有幫助。我做了我的谷歌搜索,但無濟於事。
答案應該:
- 包括實的Java(不Clojure的)的代碼多達調用connection.transact。
- 可重複使用/不需要複製&粘貼其他實體。
- 只更新已更改的屬性(?) - 我知道我應該只處理值實際已更改的屬性(正確?)。
- 正確解析多個用戶的併發編輯,即用戶不應覆蓋彼此的工作。這通常通過樂觀鎖定來解決。那麼如何在Java中對Datomic進行樂觀鎖定呢?還是有其他的策略?
(最後,一個側面提示 - 不是問題的一部分,Datomic Java文檔中沒有解釋如何編輯實體這樣的核心用例,也沒有官方示例顯示如何以最好的方式來解決這個問題呢?這種感覺並不是真的支持「Datomic Java API」。在我看來,Java和Clojure在不同的範例中工作,所以簡單地將Clojure API 1:1移植到Java並不構成Java 。API尚未 我不應該能夠註釋客戶有點(如@Id和@Version),然後就打電話connection.persist(客戶);並用它做我知道,可怕的ORM龍提高它的頭再次難看。但是,嘿,也許現在我會學習如何在一個更優雅的方式做到這一點)
嗨瓦倫丁,謝謝你的回答。我有兩個問題:1)我不明白爲什麼你在更新中創建一個新的tempid。沒有它我就更新了。 2)在版本不匹配的情況下,我無法進行db.fn/cas投擲。我在這裏更新了我的示例項目:https://github.com/ivos/datomic-java-sample CustomerServiceTest.update_Conflict()測試失敗。 – ivom
1)由於upsert的行爲,tempids不會受到傷害,這就是爲什麼我總是把它們放在一邊。 2)你的測試不起作用,因爲在你的'update()'方法中,以前的版本是從數據庫調用中計算出來的,而不是從你作爲參數傳遞的客戶端(以及你僞造的版本)中計算出來的。 –
2)對,我現在得出了同樣的結論,只是發現你已經指出了這裏。所以,關於你自己的代碼,lastKnownVersion應該來自newCustData,而不是來自oldCust。 – ivom