我目前正在使用GWT通过Google App引擎开发一个简单的Web应用程序。应该指出的是,这是我第一次尝试这样的任务。
我遇到了以下问题/困境:
我有一个简单的类(getters / setters,仅此而已。为了清楚起见,我将这个类称为DataHolder
),我想让它持久化。为此,我使用了JDO
,要求我添加一些注释,更具体地说,添加一个Key
字段作为主键。
问题是使用Key
类要求我导入com.google.appengine.api.datastore.Key
,这在服务器端是可以的,但是我不能在客户端使用DataHolder
,因为GWT
不允许它(据我所知)。
所以我创建了一个几乎完全相同的姐妹类ClientDataHolder
,尽管它没有所有JDO
注释和Key
字段。
现在这确实有效,但感觉我做错了。使用这种方法需要为我希望拥有的每个实体维护两个单独的类。
所以我的问题是:有更好的方法吗?
谢谢。
答案 0 :(得分:2)
你认为保留两个版本的对象是错误的是正确的 - GWT的整个想法是你可以在客户端共享你的服务器端对象,如果你开始离婚那么你就是没有充分利用GWT。
至于解决你的问题,我只听到了Objectify的好消息,Read more here是数据存储区的替代API,专为App Engine构建。它有很多优点,它还具有GWT安全性,因此您可以在客户端和服务器之间来回传递密钥和所有内容。 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;
}
详细了解{{3}}(这是我无耻地窃取该代码示例的地方)