Java com.google.appengine.api.datastore.Text的替代方案?
在Google App Engine中,JPA实体aJava com.google.appengine.api.datastore.Text的替代方案?,java,google-app-engine,jpa,Java,Google App Engine,Jpa,在Google App Engine中,JPA实体ajava.lang.String限制为500个字符,而a的大小不受限制(需要注意的是,entityManager.persist不能处理大于1MB的实体-我相信,但找不到关于它的参考) 然而,如果我使用谷歌特有的文本类型,我会将我的应用程序与谷歌应用程序引擎紧密结合。我想知道是否有更轻量级的方法来实现相同的结果,比如通过一些标准注释 也许,用JSR-303注释注释字符串。如果大小大于500,它将知道使用非索引文本类型。示例:@Size(最大值=
java.lang.String
限制为500个字符,而a的大小不受限制(需要注意的是,entityManager.persist不能处理大于1MB的实体-我相信,但找不到关于它的参考)
然而,如果我使用谷歌特有的文本
类型,我会将我的应用程序与谷歌应用程序引擎紧密结合。我想知道是否有更轻量级的方法来实现相同的结果,比如通过一些标准注释
也许,用JSR-303注释注释字符串
。如果大小大于500,它将知道使用非索引文本类型。示例:@Size(最大值=3000)
很明显,我只是在做梦,但也许有一些标准方法可以避免特定于应用程序引擎的数据类型。有人知道吗
更新:在datanucleus appengine中
谷歌应用程序引擎的DataNucleus插件。我猜你可能已经想到了这一点;但我还是要发布这篇文章,因为它增加了一个你的问题中没有提到的要点。我的解决方案是将其私有化,然后对于我的对象定义,我永远不会返回文本对象。我承认这并没有实现您避免应用程序引擎特定数据类型的目标;但它至少使您不必重写依赖于文本对象的一个类之外的代码,如果您决定将应用程序从应用程序引擎中移开 例如,假设text是blogPost变量
public class BlogPost {
private Text post;
// ...
public String getPost() {
return post.getValue();
}
public void setPost(String val) {
this.post = new Text(val);
}
}
如果代码感觉有点马虎,那么执行此操作可能会稍微高效一些(我不知道Text#getValue方法在内部是如何工作的)
public class BlogPost {
private Text post;
private String postValue;
// ...
public String getPost() {
return postValue;
}
public void setPost(String val) {
this.post = new Text(val);
this.postValue = val;
}
}
戴夫,谢谢你的回答。我已经在做了。进一步扩展,我可以用特定的实现实现BlogPost接口。不过,它会复制相当多的代码。为什么不在AppEngine插件上提出一个功能请求呢?实际实现起来很琐碎。关于您提出的解决方案-如果您不打算搜索任何字符串,那么为它们编制索引是没有意义的。这样做纯粹是在浪费资源。考虑到你对可移植性的担忧:实际上,如果你想利用AppEngine给你带来的好处,你必须编写特定于AppEngine的代码。我不想再担心这个了,只要试着确保你能很好地封装东西,这样以后就可以很容易地修改了。@NickJohnson我的意思是说文本是不可索引的,字符串(@DataNucleus,我明白了。@Lob,似乎是个不错的选择。它是什么意思“状态:已验证”?它是不是意味着已经实现并测试过了?谢谢