一对多的关系。从数据存储中选择对象

时间:2009-09-30 16:09:02

标签: java google-app-engine groovy jdo

我省略了一些代码(包声明,导入,其他字段) 为了简短。 我这里有简单的一对多关系。 它一直工作到现在为止。

@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个地址。

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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

<强>替换

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

<强>与

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

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

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