Java中的数据库“更新”

时间:2015-12-26 10:08:52

标签: java datomic

我用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示例最接近,但根本没有帮助。我做谷歌搜索,但没有用。

答案应该是:

  1. 包含真正的 Java (非Clojure)代码,直至调用connection.transact。
  2. 可重复使用/不需要复制和粘贴其他实体。
  3. 只更新已​​更改的属性(?) - 我知道我应该只处理值实际发生变化的属性(正确吗?)。
  4. 正确解析多个用户的并发编辑,即用户不应该覆盖彼此的工作。这通常通过乐观锁定来解决。那么如何在Java中的Datomic中进行乐观锁定?或者还有其他策略吗?
  5. (最后,附注 - 不是问题的一部分。如何在Datomic Java文档中解释如此“编辑实体”这样的核心用例,也没有一个官方示例显示如何在最好的方法?这种感觉“Datomic Java API”并不是真的支持。在我看来,Java和Clojure在不同的范例上工作,所以简单地将Clojure API 1:1移植到Java并不构成Java API。 我不应该稍微注释一下客户(比如 @Id @Version )然后只需要调用 connection.persist(customer); 并完成它?我知道,可怕的ORM龙再次抬起它丑陋的脑袋。但是,嘿,也许现在我将以更优雅的方式学习如何做到这一点。)

1 个答案:

答案 0 :(得分:1)

回答你的一些问题:

  1. 您没有只有来处理已更改的字段,Datomic将在运行事务时忽略未为您更改的属性。
  2. Datomic不提供类映射层,也许永远不会。我不知道在社区中开发的那个,也不会让我感到惊讶,因为这个社区倾向于为了通用性而偏向于面向数据(而不是基于类)的体系结构。因此,您将找不到例如由ORM提供的从Datomic数据一般转换为POJO的实用程序。
  3. 这并不意味着Java在这里完全是二等公民 - 但是Datomic会迫使你(为了你自己的利益,如果你要求创作者)使用数据结构,如列表和地图而不是POJO来传达信息。这在Clojure中确实比在Java中更惯用。
  4. 我个人强烈建议您使用实体(即window.addEventListener('scroll', function () { var scrollTop = document.body.scrollTop || document.documentElement.scrollTop; var nav = document.getElementById('scroll-nav'); if (scrollTop >= 300) { nav.style.backgroundColor = 'grey'; } else { nav.style.backgroundColor = '#f9f7f1'; } }, false); 类的实例)而不是POJO作为您的业务逻辑 - 至少尝试一下,在编写映射代码之前先看看是否存在问题。你失去一些静态保证 - 可能还有很多样板。尽管如此,下面的实现确实使用了POJO。
  5. 我已经在下面给你了我的实现。基本上,您将Customer对象转换为事务映射,并使用datomic.Entity事务函数来获得更新所需的并发保证。

    如果你是一位经验丰富的Java开发人员,这对你来说可能看起来不太优雅 - 我知道这种感觉。同样,这并不意味着您无法从Java中获得Datomic的好处。您是否可以遵守面向数据的API取决于您,而这个问题并非特定于Datomic - 尽管Datomic倾向于将您推向数据方向,例如通过实体。

    :db.fn/cas