2009-09-30 4 views
1

J'ai omis du code (déclarations de package, importations, autres champs) pour la shortness. J'ai ici simple relation un-à-plusieurs. Ça a bien fonctionné jusqu'à ce moment.Relation un-à-plusieurs. Sélectionner des objets du magasin de données

@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 
} 

maintenant, je doivent obtenir (choisir) tous les restaurants de 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() 
    } 
} 

mais il y a le problème - requête me donne 12 restaurants (comme dans DB), mais tous les restaurants a 0 Adresse mais Datastore tous les restaurants a minimum 2 ajouter resses.

Avez-vous le même problème ou connaît la solution? Êtes-vous sûr que les adresses ne sont pas chargées paresseusement?

Répondre

1

Si quelqu'un « impatient » aura le même problème:

Remplacer

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

avec

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

Une autre méthode est que vous devez "toucher" la propriété d'adresses pour tous les restaurants dans la liste récupérée avant la fermeture PersistentManager. Après la fermeture de PersistenManager, vous ne pouvez pas récupérer dans le magasin de données et le restaurant conserve la valeur null.

Solution trouvée à l'aide de google-appengine-java utilisateurs.

+0

Avez-vous un lien vers la/les discussion (s) relative (s) à ce sujet du groupe google? – pkaeding

1

Juste une supposition ... est-il un moyen de forcer un chargement des objets