更改实体后,GAE数据存储查询有时无法正常工作

时间:2013-04-08 02:20:55

标签: google-app-engine jpa google-cloud-datastore datanucleus

我正试图找出一个我正在看的问题。我注意到,当我通过添加新字段来更改实体对象定义时,有时我不再能够从数据存储区中已存在的先前记录中获得结果。例如,在下面的这个例子中,我可以看到数据存储区中的实体,但我得到了这个例外:

严重:查询没有结果:SELECT FROM com.alero.services.model.MyEntity myEntity WHERE myEntity.key =:key

我正在使用JPA和GAE数据存储区。

我似乎能够纠正问题并再次开始获得结果的唯一方法是删除appengine生成的目录,然后重新创建实体。它是以某种方式缓存的吗?我应该做些什么来让数据存储区知道在这种情况下它需要删除缓存?

        String queryString = "select from " + MyEntity.class.getName()
                + " myentity where myentity.key = :key";

        Key keySub = KeyFactory.createKey("MyEntity", myEntityId);

        Query query = em.createQuery(queryString);
        query.setParameter("key", KeyFactory.keyToString(keySub));

        try {
            MyEntity myEntity = (MyEntity) query.getSingleResult();
            em.close();
            return myEntity;
        } catch (Exception e) {         
            log.severe(e.getMessage());
            em.close();
        }

1 个答案:

答案 0 :(得分:1)

其实我发现了这个问题。这与我改变我的实体并没有多大关系。这就是我坚持和合并我的实体的方式。我在一个无主的双向关系中有两个实体之间的无主关系,我在保持我的实体之前添加了对彼此的引用。这创造了一种自有的关系。因此,当我使用我的密钥查询时,我没有找到它,因为当我尝试将其作为父密钥查询时,实体上的实际密钥是子密钥。

所以我需要在双向关系中相互添加关系之前保留我的两个实体。然后我可以合并它们。这为每个实体创建了一个父键,然后我可以在双向关系之间创建我的关系。