0

私が見ている問題を理解しようとしています。たとえば、新しいフィールドを追加してエンティティ オブジェクトの定義を変更すると、データストアに既に存在する以前のレコードから結果を取得できなくなることがあります。たとえば、次の例では、データストアにエンティティが表示されていますが、次の例外が発生しています。

SEVERE: クエリの結果がありません: SELECT FROM com.alero.services.model.MyEntity myEntity WHERE myEntity.key = :key

GAE データストアで JPA を使用しています。

問題を修正して結果を再び取得できるように思われる唯一の方法は、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();
        }
4

1 に答える 1

1

実際、私は問題を発見しました。それは私が自分のエンティティを変更したこととはあまり関係がありませんでした。それが、エンティティを永続化してマージする方法でした。所有されていない双方向の関係にある 2 つのエンティティ間に所有されていない関係があり、エンティティを永続化する前に相互に参照を追加していました。これは、所有された関係を作成していました。したがって、キーを使用してクエリを実行したときに、エンティティの実際のキーが親キーとしてクエリを実行しようとしたときに子キーだったため、それが見つかりませんでした。

したがって、双方向の関係で関係を相互に追加する前に、2 つのエンティティを永続化する必要があります。その後、それらをマージできます。これにより、エンティティごとに親キーが作成され、双方向の関係の間に関係を作成できます。

于 2013-04-08T04:14:36.907 に答える