【发布时间】:2016-03-31 22:23:50
【问题描述】:
我用 Java 做我的项目(后端)。我不想切换到 Clojure(反正还没有)。
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 架构声明了相应的属性:customer/name、:customer/email、:customer/phone 等。
有一个“编辑客户”表单公开了要更改的用户的 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(customer); 就这样结束了吗?我知道,可怕的ORM巨龙又抬起了丑陋的头。但是,嘿,也许现在我会以一种更优雅的方式学习如何做到这一点。)
【问题讨论】: