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

4
我目前正在使用GWT通过Google App引擎开发一个简单的Web应用程序。需要注意的是,这是我首次尝试此类任务。
我遇到了以下问题/困境:
我有一个简单的类(只有getter / setter,为了清晰起见,我将此类称为DataHolder),我想使其持久化。为此,我使用了JDO,这要求我添加一些注释,更具体地说,添加一个Key字段作为主键。
问题在于,使用Key类需要我导入com.google.appengine.api.datastore.Key,这在服务器端上是可以的,但是我不能在客户端上使用DataHolder,因为据我所知,GWT不允许这样做。
因此,我创建了一个几乎相同的姐妹类ClientDataHolder,虽然它没有所有的JDO注释和Key字段。
现在这实际上可以工作,但感觉像是我在做错事情。使用这种方法需要维护每个实体所需的两个单独的类。
因此,我的问题是:有更好的方法吗?
谢谢。
1个回答

2
您的翻译如下:

您的想法是正确的,保留对象的两个版本确实不太合适。GWT 的整个理念就是可以在客户端共享服务器端的对象,如果您开始将其分离,就无法充分利用 GWT。

至于解决您的问题,我听说 Objectify 是一个非常好的选择,它是一个专门为 App Engine 构建的替代数据存储 API。它有许多优点,其中之一就是它也可以与 GWT 兼容,因此您可以在客户端和服务器端之间传递 Keys 等信息。点击此处了解更多信息

但是,如果您想使用 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;
}

阅读更多关于这里的内容(这就是我无耻地窃取那个代码示例的地方)


谢谢。String id 很好用。 我想我会尝试使用 Objectify,因为它似乎正是我正在寻找的东西。 - dankilman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接