GAE的Datastore是基于Big Table的,号称是面向对象的数据库(object-oriented database),而不是关系数据库。因此,Datastore是有非常大的局限性的,至少对于熟悉使用关系数据库或SQL的人来说。
1.查询操作符
查询操作符只支持<, <=, ==, >=, >
不支持 !=, IN, LIKE
操作符后面只能跟常量值,不能引用实体的属性
在一个查询里,只允许一个属性使用非等于的操作符(<, <=, >=, >)
2.逻辑操作符
支持 AND(&&)
不支持 OR, NOT
3.排序
在一个查询里,使用了非等于操作符的属性必须在ORDER BY从句必须是在第一位
4.不支持关联查询
不支持JOIN
5.不支持集合函数
不支持group by, having, sum, avg, max, min
其他的以后发现了再补充。
参考:GAE Datastore Queries and Indexes
Google App Engine SDK 有更新了!不过这次释出的只是DataNucleus App Engine plugin,是GAE for Java中的持久层框架,支持JPA和JDO。版本号是1.0.1 Release Candidate 1,下载地址在是:http://datanucleus-appengine.googlecode.com/files/appengine-orm-1.0.1.RC1.zip。这个发布只要是bug fixed,详细的bug fixed 请查看这里。还需要注意的是,这不是官方正式发布的,详细内容请看Google Group。如果以后想查看更多版本的DataNucleus plugin for Google App Engine,可以到这里:http://code.google.com/p/datanucleus-appengine/downloads/list。
1.备份Google App Engine SDK
把\plugins\com.google.appengine.eclipse.sdkbundle_1.2.0.v200904062334\appengine-java-sdk-1.2.0这个目录备份
2.下载DataNucleus App Engine plugin 1.0.1RC1
地址是http://datanucleus-appengine.googlecode.com/files/appengine-orm-1.0.1.RC1.zip
3.把下载的ZIP压缩包解压并覆盖到\plugins\com.google.appengine.eclipse.sdkbundle_1.2.0.v200904062334\appengine-java-sdk-1.2.0
4.移除旧版本的DataNucleus App Engine plugin的jar包
删除\plugins\com.google.appengine.eclipse.sdkbundle_1.2.0.v200904062334\appengine-java-sdk-1.2.0\lib\user\orm\datanucleus-appengine-1.0.0.final.jar
5.重启Eclipse
关于shoopman.co.cc域名的问题,co.cc给我回来邮件,但是他们的建议也是行不通的。继续在co.cc上找FAQ,却看到了这个免费域名,只是第一年免费使用,以后要使用就要交钱了。想了想,还是自己申请一个顶级域名算了,反正一年也就几十RMB或者几美刀。
在网上查了一下相关问题,决定使用美刀在国外注册域名,原因有:不需要备案,域名管理自由度更大。可是Google App已经彻底不支持cn域名绑定了,原来的cn改CN这漏洞估计在ZF的压力下已经给堵上了,连cN和Cn也不行了。看来只好放弃cn,改用其他域名了。
根据网上的资料,我开始在GoDaddy上注册域名。GoDaddy网速比较慢,但也只好忍了。一步一步的注册帐号,选择域名,付款—-出问题了!Paypal无法支付!赶紧继续在网上找原因:原来我的是贝宝帐号,而不是Paypal;贝宝只能在国内使用,不能通过信用卡向国外支付。于是觉得Paypal太恶心了,都是www.paypal.com这个网址,可居然有两套用户体系;虽然是有历史原因的,但不能想办法整合整合吗?
抱怨归抱怨,还得重新注册Paypal帐号好完成这笔支付。直接通过信用卡虽然也可以支付,但月光博客的亲身经历却让我取消了这个念头。顺利申请了Paypal帐号后,关联信用卡时却又卡住了—-Paypal要从我的招行信用卡先扣去$1.95,待关联验证后归还到Paypal帐号里。这$1.95是不用想拿回来了,Paypal的客服说需要Paypal余额需要达到$150后才能提现。神啊,有没有$1.95的东西,好让我花了它啊!Paypal客服还说了,信用卡不需要等待关联验证后,即可付款。我汗,我还傻傻的等了好半天啊!继续回到GoDaddy支付,可是依然不成功:
Transaction refused due to risk model (10205)
There was a problem authorizing your credit. Please verify your payment information or use an alternate form of payment.
Please click here to go back and confirm that your information is correct.
按照
IDCSpy帖子里的说法,往Paypal帐号里又添加了一张招商银行的储蓄卡,还是一样的支付失败。相当郁闷啊,看来只有选择
IDCSpy的代购了,通过支付宝给他们支付的RMB,IDCSpy给我发相应美刀的GoDaddy Gift Card Code。$7.69,汇率按7算,折合成人民币不到60块,支付大概5个小时后,就收到了GoDaddy Gift Card Code,动作还是相当快的。只是可怜我那$1.95,白送给Paypal了。
在Google Reader中看了JavaEye新闻里的关于“Oracle收购Sun”的消息,发现Javaeye上的同志讨论可真积极,评论都60多条了,于是点击进去想看看他们的高见。可是浏览器却短暂的没有了响应,而后弹出了一个ActiveX控件被拒绝安装的提示,接着360安全卫士也来了:“拦截到一个木马或恶意广告页面”,而Javaeye的页面则是一片乱码:
也许是JavaEye近年发展太快了,树大招风;也许是robin有时稍微尖锐的言论又得罪了小人。。。希望JavaEye能早点恢复。
因为Google App现在已经不支持绑定裸域了,而我也只是拥有shoopman.co.cc这个域名而不是co.cc,所以我也没有办法直接绑定shoopman.co.cc到shoopmanlog.appspot.com上来,只好新建www.shoopman.co.cc这个三级子域名来绑定了。
在co.cc的域名管理里,Name Server(域名解析服务器?)、Zone Records(A/MX/CNAME)和URL Forwording(URL转发)是互斥的,只能三选一。www.shoopman.co.cc这个子域名已经添加了一个类型为A记录的Zone Record了,而类型为NS的Zone Record又不能用在shoopman.co.cc这个域名上。如果重新设置shoopman.co.cc的Name Server或者URL Forwording,Zone Records会全部被删掉。。。
4.18晚,就这个问题,我已经发了封邮件给co.cc,希望他们能看得懂我的E文。。。可是现在还没有收到回复。
唉。。。不知还有没有其他办法。
做了一个简单的一对一(OneToOne)关系的JPA测试,在本地Eclipse中没有问题,但部署到GAE后,添加数据成功而在显示数据的时候却报500错误。幸好GAE控制台有详细错误日志:
/oneone.jsp
java.lang.ClassCastException: com.google.appengine.api.datastore.DatastoreNeedIndexException cannot be cast to javax.servlet.ServletException
at org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:754)
at org.apache.jsp.oneone_jsp._jspService(oneone_jsp.java:100)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:94)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
看来是忘记给datastore指定,参看GAE的文档Queries And Indexes,赶紧在WEB-INF添加datastore-indexes.xml,再把本地自动生成的index(在WEB-INF/appengine-generated/datastore-indexes-auto.xml中)的内容复制进去,如下:
xmlns=”http://appengine.google.com/ns/datastore-indexes/1.0“
autoGenerate=”true”>
source=”auto” />
重新部署到GAE中,运行正常。
测试地址:http://shoopmanga.appspot.com/oneone.jsp
前段时间申请了一个免费的二级域名shoopman.co.cc(关于co.cc的中文介绍可以点这里,申请地址在http://www.co.cc),在Google App Engine部署了用python写的Blog后,当然也想绑定这个短小的域名到这个Blog上,于是开始了折腾:
1.进入Google App Engine管理中心,选择安装了博客的的应用ID,我这个是“shoopmanlog”,在应用控制台里,点左边的导航菜单的“Version”。
2.在Version页输入了我申请的免费域名”shoopman.co.cc”,点击“Add Domain”按钮,页面居然却跳到了
Google App(Google企业应用套件)的注册页。
3.按照Google App的提示,成功申请了一个Google App的帐号。需要注意的是,Google App暂时不支持中国地区,换一个地区比如美国,就能成功申请了。
5.切换回到Google App中,点击“验证”按钮,Google提示在48个小时内完成验证。
6.我没有那么大的耐心等48小时再做下一步操作,直接到Google App添加Google App Engine服务,如图
8.等待吧,耐心等待域名解析生效吧。。。我的大概是4、5个小时后就生效了,哦也!
GAE不支持spring-orm是因为引用了javax.naming包里的类,而这些类是不被GAE支持的。在spring-orm-2.5.6.jar移去一下类则可:
PersistenceAnnotationBeanPostProcessor.class
PersistenceAnnotationBeanPostProcessor$PersistenceElement.class
PersistenceAnnotationBeanPostProcessor$2.class
PersistenceAnnotationBeanPostProcessor$1.class
这个我还没有验证过。出自Google Group。