GAE/Jをデプロイする時はインデクスを定義しとかないと

ローカルでは動いてるんだけど、appspotにデプロイしたら動かない。下のようなエラーがでてる。どうやら、インデックスが見つかんないよって言ってるらしい。

org.datanucleus.ObjectManagerImpl preCommit: com.google.appengine.api.datastore.DatastoreNeedIndexException: no matching index found.

Uncaught exception from servlet
javax.jdo.JDOException: Unexpected error during precommit
	at org.datanucleus.jdo.NucleusJDOHelper.getJDOExceptionForNucleusException(NucleusJDOHelper.java:419)
	at org.datanucleus.jdo.JDOTransaction.commit(JDOTransaction.java:132)

ローカルの環境では、war/WEB-INF/appengine-generated/datastore-indexes-auto.xmlというファイルにインデックスの定義が自動で作成される。これをコピってwar/WEB-INF/の直下に「datastore-indexes.xml」というファイルを作ってからデプロイする必要がある。

  • war/WEB-INF/appengine-generated/datastore-indexes-auto.xml
    • このファイルは自動で作られる
  • war/WEB-INF/datastore-indexes.xml
    • このファイルは上の自動で作られるファイルの内容をコピって自分で作る

データの検索や登録の度「datastore-indexes-auto.xml」にインデクスの定義が追加されたり消えたりするので、とりあえず出てきたものは「datastore-indexes.xml」にコピっておく、ちょっと面倒くさい。どうして追加されたり消えたりするのかわからないけど、今はとりあえずいいや。

そして、一通り動かしてみてインデックス定義を「datastore-indexes.xml」の方(WEB-INF直下の方ね)に拾い集めておき、デプロイする。そしたら、上のエラーは消えた。でもまだ一ヶ所このエラーがでるけど(データを追加するとき)、データは登録されてるのでとりあえずいいや。

さて、何となく出きるようになってきたので、インデックスについてちゃんと読んでみた方がいいね。このへん↓とか読んだら分かるのかなー。
http://code.google.com/intl/ja/appengine/docs/java/datastore/queriesandindexes.html#Defining_Indexes_With_Configuration
あと、↓同じように悩んでる方がいますね。これ見てもよく分からなかったのでやっぱりマニュアルちゃんと読まないと先へすすめない感じ。
Google グループ