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 的意见 [关闭]

提交的 JDO 写入不适用于本地 GAE HRD,或可能重用的事务

Gae Jdo 对具有双向导航的一对多拥有关系的持久性

查询未检索到嵌入式 JDO 字段

JDO 异常:“查询需要 1 个参数,但已提供 2 个值。”