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()
   }
 }

但是有一个问题 - 查询给了我 12 家餐厅(如在 DB 中),但每家餐厅都有 0 地址,但在 Datastore 中,每家餐厅至少有 2 个地址。

有没有人遇到同样的问题或知道解决方案?

4

2 回答 2

1

你确定地址不是延迟加载的吗?只是一个猜测......是否有某种方法可以强制“急切”加载对象

于 2009-10-01T01:30:38.813 回答
1

如果有人会遇到同样的问题:

代替

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

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

另一种方法是您必须在关闭 PersistentManager 之前“触摸”检索到的列表中每个餐厅的地址属性。PersistenManager 关闭后,您无法从数据存储中检索任何内容,并且 Restaurant 保持为空。

在google-appengine-java用户的帮助下找到了解决方案。

于 2009-10-02T13:16:09.323 回答