将尝试回答您的问题:
我是否完全错过了这里的重点?
没有。您可以将 noSQL CB 视为持久分布式对象缓存。所以它不是RDBMS。但是,DAO 模式非常适合这个模型……因为您要在 DAO 级别和 noSQL 级别处理 DTO/ValueObjects/POJO。
我无法想象每个人都这样做?
我建议编写一个可以持久化/检索 POJO 的通用 Couchbase 管理器类。然后你可以在你的 DAO 中重新使用它。
每个人都在编写将 Documents 转换为 POJO 模型类的方法
分别为每个班级?或者使用 json 解析器来做到这一点(但是
如果我不想加载外键,它就不能工作,是吗?
您可以在您的 Couchbase 管理器类中使用一个通用代码来执行从/到 json 到 POJO 的转换。因此,您只使用 POJO,并且在您的应用程序代码中看不到任何 json(在 Couchbase 管理器类之外)
这是此类的一个示例:
public class CouchbaseManager<K, V>
{
private final Class<V> valueTypeParameterClass;
@Inject
private CouchbaseClient cbClient;
@Inject
private Gson gson;
public CouchbaseManager(final Class<V> valueClass)
{
this.valueTypeParameterClass = valueClass;
}
public V get(K key)
{
V res = null;
String jsonValue = null;
if (key != null)
{
jsonValue = (String) cbClient.get(key);
if (jsonValue != null)
{
res = gson.fromJson(jsonValue, valueTypeParameterClass);
}
}
return res;
}
public void put(K key, V value)
{
int ttl = 0;
cbClient.set(key, ttl, gson.toJson(value, valueTypeParameterClass));
}
}
然后在您的 DAO 代码中为每种类型创建 CouchbaseManager 实例:
CouchbaseManager<String,Customer> cbmCustomer = new CouchbaseManager<String,Customer>(Customer.class);
CouchbaseManager<String,Account> cbmAccount = new CouchbaseManager<String,Account>(Account.class);
// and so on for other POJOs you have.
// then get/put operations look simple
Customer cust = cbmCustomer.get("cust-1234");
cust.setName("New Name"); // mutate value
// store changes
cbmCustomer.put(cust.getId(), cust);
现在关于“外键”。请记住,它不是 RDBMS,因此取决于您的代码是否具有“外键”的概念。例如,客户类可以有一个帐户的 id:
Customer cust = cbmCustomer.get("cust-1234");
String accId = cust.getAccountId();
//You can load account
Account acc = cbmAccount.get(accId);
如您所见,这一切都是您自己做的。我希望它是 JPA 或 JDO Couchbase 的实现/提供者(如 DataNucleus 或 Hibernate)
您应该真正从您的 POJO/文档设计开始,尝试将您的 POJO 实体拆分为数据“块”,以在粗粒度和细粒度 POJO 之间取得适当的平衡。
另见this discussion on key/document design considerations。