1

簡潔にするために、いくつかのコード(パッケージ宣言、インポート、その他のフィールド)を省略しました。ここに単純な1対多の関係があります。この瞬間まではうまくいきました。

@PersistenceCapable(identityType = IdentityType.APPLICATION,
detachable="true")
class Restaurant implements Serializable {

 @PrimaryKey
 @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
 Key id

 @Persistent(mappedBy = "restaurant")
 List<RestaurantAddress> addresses = new ArrayList<RestaurantAddress>()
}

//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

@PersistenceCapable(identityType = IdentityType.APPLICATION,
detachable="true")
class RestaurantAddress implements Serializable {

 @PrimaryKey
 @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
 Key id

 @Persistent
 Restaurant restaurant
}

今、私はDBからすべてのレストランを取得(選択)する必要があります:

def getRestaurantsToExport(final String dst, final int count) {
   String field = restaurantExportFields[dst]
   return transactionExecute() { PersistenceManager pm ->
     Query q = pm.newQuery(Restaurant.class)
     q.filter = "$field == null"
     q.setRange(0, count)
     return q.execute()
   }
 }

しかし、問題があります。クエリでは(DBのように)12のレストランが表示されますが、すべてのレストランの住所は0ですが、データストアではすべてのレストランの住所が2つ以上あります。

誰か同じ問題を抱えているか、解決策を知っていますか?

4

2 に答える 2

1

誰かが同じ問題を抱えている場合:

交換

@Persistent(mappedBy = "restaurant")
 List<RestaurantAddress> addresses = new
ArrayList<RestaurantAddress>

@Persistent(mappedBy = "restaurant",defaultFetchGroup = "true")
 List<RestaurantAddress> addresses = new
ArrayList<RestaurantAddress>

もう1つの方法は、PersistentManagerを閉じる前に、取得したリスト内のすべてのレストランのアドレスプロパティを「タッチ」する必要があることです。PersistenManagerを閉じた後は、データストアから何も取得できず、Restaurantはnullのままになります。

google-appengine-javaユーザーの助けを借りて見つかった解決策。

于 2009-10-02T13:16:09.323 に答える
1

アドレスが遅延ロードされていませんか?推測です...オブジェクトの「熱心な」読み込みを強制する方法はありますか

于 2009-10-01T01:30:38.813 に答える