我用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示例最接近,但根本没有帮助。我做谷歌搜索,但没有用。
答案应该是:
(最后,附注 - 不是问题的一部分。如何在Datomic Java文档中解释如此“编辑实体”这样的核心用例,也没有一个官方示例显示如何在最好的方法?这种感觉“Datomic Java API”并不是真的支持。在我看来,Java和Clojure在不同的范例上工作,所以简单地将Clojure API 1:1移植到Java并不构成Java API。 我不应该稍微注释一下客户(比如 @Id 和 @Version )然后只需要调用 connection.persist(customer); 并完成它?我知道,可怕的ORM龙再次抬起它丑陋的脑袋。但是,嘿,也许现在我将以更优雅的方式学习如何做到这一点。)
答案 0 :(得分:1)
回答你的一些问题:
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。我已经在下面给你了我的实现。基本上,您将Customer对象转换为事务映射,并使用datomic.Entity
事务函数来获得更新所需的并发保证。
如果你是一位经验丰富的Java开发人员,这对你来说可能看起来不太优雅 - 我知道这种感觉。同样,这并不意味着您无法从Java中获得Datomic的好处。您是否可以遵守面向数据的API取决于您,而这个问题并非特定于Datomic - 尽管Datomic倾向于将您推向数据方向,例如通过实体。
:db.fn/cas