尽管appengine已经是无模式的,但是仍然需要定义需要通过Datanucleus持久层存储到Datastore中的实体。因此,我正在考虑一种绕过这个问题的方法;通过在运行时存储键值的层,而不是编译时实体。
使用Redis的方法是创建一个如下键:
private static final String USER_ID_FORMAT = "user:id:%s";
private static final String USER_NAME_FORMAT = "user:name:%s";文档中的Redis类型有:String、Linked-list、Set、Sorted set。我不确定是否还有更多。
对于GAE数据存储,字符串"Key“和"Value”必须是要存储的实体。
像这样:
public class KeyValue {
private String key;
private Value value; // value can be a String, Linked-list, Set or Sorted set etc.
// Code omitted
}此方案的合理性源于对数据存储的Restful访问(由Datanucleus-api-rest提供)
使用此rest api,持久化对象或实体:
POST http://datanucleus.appspot.com/dn/guestbook.Greeting
{"author":null,
"class":"guestbook.Greeting",
"content":"test insert",
"date":1239213923232}这种方法的问题在于,为了持久化实体,需要在编译时定义实际的类;与拥有键值存储机制的想法不同,我们可以简化方法调用:
POST http://datanucleus.appspot.com/dn/org.myframework.KeyValue
{ "class":"org.myframework.KeyValue"
"key":"user:id:johnsmith;followers",
"value":"the_list",
}将单个字符串作为"value“传递是相当简单的,我可以使用JSON数组来表示列表、集合或排序列表。真正的问题是如何真正持久化传递到接口中的不同类型的数据。是否应该有多个KeyValue实体,每个实体代表它支持的基本类型: KeyValueString?KeyValueList?等。
发布于 2012-06-19 03:23:13
看起来您正在使用基于JSON的REST API,那么为什么不直接将值存储为JSON字符串呢?
发布于 2012-06-19 05:12:29
您不需要使用Datanucleus层或任何其他精细的ORM层(如Twig或Objectify)。这些都是可选的,并且都基于低级API。如果我正确地解释了你说的话,也许它已经有了你想要的功能。请参阅:https://developers.google.com/appengine/docs/java/datastore/entities
发布于 2012-06-19 19:15:14
Datanucleus是一个运行在GAE之上的特定框架。但是,您可以在一个较低、结构较差、更像键/值的级别--低级API --访问数据库。这是您可以直接访问的最低级别。顺便说一句,低级的“GAE数据存储”内部运行在6个全局Google Megastore表上,而这些表又托管在Google Big Table数据库系统上。将JSON保存为字符串可以很好地工作。但您需要通过ID以外的方法来检索对象,也就是说,您需要一种索引数据的方法来支持对数据的任何类型的有用查询。
https://stackoverflow.com/questions/11088442
复制相似问题