使用GWT和持久对象的正确方法是什么?

我目前正在使用GWT通过Google App引擎开发一个简单的Web应用程序.应该指出的是,这是我第一次尝试这样的任务.

我遇到了以下问题/困境:

我有一个简单的类(getters / setters,仅此而已.为了清楚起见,我将这个类称为DataHolder),我想让它持久化.为此,我使用了JDO,它要求我添加一些注释,更具体地说,添加一个Key字段作为主键.

问题是使用Key类要求我导入com.google.appengine.api.datastore.Key,这在服务器端是可以的,但是我不能在客户端使用DataHolder,因为GWT不允许它(据我所知).

所以我创建了一个几乎完全相同的姐妹类ClientDataHolder,尽管它没有所有JDO注释和Key字段.

现在这确实有效,但感觉我做错了什么.使用这种方法需要为我希望拥有的每个实体维护两个单独的类.

所以我的问题是:有更好的方法吗?

谢谢.

最佳答案 你认为保留两个版本的对象是错误的是正确的 – GWT的整个想法是你可以在客户端共享你的服务器端对象,如果你开始离婚这两个你没有充分GWT的优势.

至于解决你的问题,我只听到了关于Objectify的好消息,这是一个专为App Engine构建的数据存储区的替代API.它有很多优点,它还具有GWT安全性,因此您可以在客户端和服务器之间来回传递密钥和所有内容. Read more here.

但是,如果要使用JDO / JPA,只需将实体ID存储为字符串或长整数,如下所示:

@PersistenceCapable(identityType = IdentityType.APPLICATION)  
public class SomeDomainClass implements Serializable {  
  @PrimaryKey  
  @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)  
  @Extension(vendorName = "datanucleus", key = "gae.encoded-pk", value = "true")  
  String id;
}

阅读更多关于here(这是我无耻地窃取该代码示例的地方)

点赞