GAE JDO 空查询结果
Posted
技术标签:
【中文标题】GAE JDO 空查询结果【英文标题】:GAE JDO Empty Query Result 【发布时间】:2011-09-03 19:28:29 【问题描述】:我正在组合一个简单的 GWT、GAE、JDO 应用程序。首先,我试图存储一张猫记录表。我设法让 RPC 机制在我的调用中工作以保存数据(请参阅下面的 setCOTDCats())。据我所知,RPC 调用是成功的。但是,当我尝试读回这些值时(请参阅下面的 getCOTDCats()),它似乎也可以工作,只是它返回一个空结果。
显然,要么保存无效,要么读取无效,但我不知道如何判断哪个无效。
我是 GAE 和 JDO 新手。请在任何回复中考虑到这一点。
谢谢
请不要打蛇
@Override
public Cat[] getCOTDCats()
final List<Cat> catList = new ArrayList<Cat>();
final PersistenceManager pm = getPersistenceManager();
try
final Query q = pm.newQuery(CatRecord.class);
q.setOrdering("COTDDate");
final List<CatRecord> catRecords = (List<CatRecord>) q.execute();
for (CatRecord catRecord: catRecords)
final Cat cat = catRecord.getCat();
catList.add(cat);
finally
pm.close();
final Cat[] result = catList.toArray(new Cat[0]);
return result;
/* (non-Javadoc)
* @see org.catadoptionteam.catserve.client.AnimalDataService#setCOTDCats(org.catadoptionteam.catserve.shared.Cat[])
*/
@Override
public void setCOTDCats(Cat[] cat)
final List<CatRecord> catList = new ArrayList<CatRecord>();
for (Cat c: cat)
final CatRecord catRecord = new CatRecord(c);
catList.add(catRecord);
final PersistenceManager pm = getPersistenceManager();
try
pm.makePersistentAll(catList);
finally
pm.close();
private static PersistenceManager getPersistenceManager()
final PersistenceManager result = Persister.getPersistenceManager();
return result;
public enum Persister
INSTANCE;
private static final PersistenceManagerFactory pmfInstance =
JDOHelper.getPersistenceManagerFactory("transactions-optional");
public static PersistenceManager getPersistenceManager()
final PersistenceManager result = pmfInstance.getPersistenceManager();
return result;
【问题讨论】:
我今天花了很多时间尝试不同的事情。我现在似乎正在取回数据,但这是不正确的。我删除了我的 PersistenceCapable CatRecord 中的一些字段。我想知道我的一种(或多种)数据类型是否无效?我正在使用 Key、String、Date、boolean、Text 和我定义的枚举。 local_db 查看器会告诉您保存是否有效。日志还告诉你很多事情 现在似乎工作得更好了。我不确定出了什么问题。我发现删除 war/WEB-INF/appengine-generated/* 文件似乎有帮助。我不知道这是否是个好主意。我只是通过反复试验才发现的。 【参考方案1】:问题可能在于您处理 PersistenceManager 的方式。定义一个类 PMF.java 如下:
import javax.jdo.JDOHelper;
import javax.jdo.PersistenceManagerFactory;
public final class PMF
private static final PersistenceManagerFactory pmfInstance = JDOHelper
.getPersistenceManagerFactory("transactions-optional");
private PMF()
public static PersistenceManagerFactory get()
return pmfInstance;
然后,当您想要访问 PersistenceManager 时,您应该调用:
PersistenceManager pm = PMF.get().getPersistenceManager();
此外,您的所有模型(在您的示例中为 Cat)都应使用 JDO 定义。详细信息请查看:http://code.google.com/appengine/docs/java/datastore/jdo/
希望这会有所帮助!
【讨论】:
谢谢,我在上面添加了更多关于我对 PersistenceManager 所做的事情的详细信息。对我来说似乎是一样的。 我想我已经将 CatRecord 和 Cat 定义为 @PersistenceCapable(identityType = IdentityType.APPLICATION, detachable="true") public final class CatRecord @PrimaryKey @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) private Key ID; ... 如果有帮助,我可以发布更多代码。是否有数据库浏览器工具可以让我查看写入是否有效? 本地数据库查看器:localhost:8080/_ah/admin 请注意,根据您的配置,端口可能会有所不同。以上是关于GAE JDO 空查询结果的主要内容,如果未能解决你的问题,请参考以下文章
GWT+UIBinder+Gin+Guice+JDO+GAE 示例
寻找关于在 GAE-J 中使用 Objectify-appengine 而不是 JDO 的意见 [关闭]