2013-04-12 1 views
3

Je suis nouveau à CouchDB et Ektorp (j'ai commencé réellement aujourd'hui pour essayer de travailler avec lui). La documentation plus détaillée que j'ai trouvé me aide pour commencer est celui-ci:Quelqu'un peut-il m'expliquer en cascade et FetchType paresseux dans Ektorp?

http://www.ektorp.org/reference_documentation.html#d100e394

Mon cas d'utilisation est que je veux sauver une classe très complexe en tant que document (j'ai réussi que jusqu'à présent), mais je ne veux pas charger tous les champs tout le temps (puisque certains d'entre eux sont potentiellement de grandes collections d'autres documents plus simples).

Voici un exemple de ce que je (sa juste une classe expérimentale j'utilise pour apprendre à utiliser Ektorp et CouchDB

@JsonSerialize(include = Inclusion.NON_NULL) 
public class Player extends CouchDbDocument { 

    private int xp = 0; 

    @JsonDeserialize(using = CoinPouchDeserializer.class) 
    private CoinPouch coins = new CoinPouch(); // subclass of enumMap not 
          // complex 
    @DocumentReferences(backReference = "playerId", fetch = FetchType.LAZY, descendingSortOrder = true, orderBy = "itemid") 
    private Inventory inventory = new Inventory();// subclass of Map<String, 
          // Item> Items are document 
          // themselves 
} 

je parviens à le sauver et obtenir par id très bien. Mais comment pour que je reçois sans inventaire chargement il?
Je voudrais aussi apprécier tout lien vers d'autres ressources que je devrais terminer session à commencer à utiliser CouchDB ou EKTORP avec java (ou scala), acclamations.

Merci pour toute réponse utile.

Répondre

1

Les références de document comme celles-ci agissent fondamentalement de la même manière que JOINs dans une base de données SQL, mais vous ne pouvez pas faire de JOIN dans une requête comme vous pouvez le faire avec SQL. Au lieu de cela, vous devez faire la première demande pour obtenir le document de base que vous recherchez, puis une deuxième demande pour obtenir les documents référencés. Si vous configurez FetchType avec impatience, Ektorp doit le faire dès que vous lisez le premier document, de sorte qu'une série de requêtes est immédiatement exécutée pour tous les documents référencés, en veillant à ce que tout soit chargé avant de commencer à l'utiliser. FetchType paresseux ne fait pas cela, et ignore à la place les documents référencés jusqu'à ce que vous essayiez de les utiliser.

Généralement, vous voulez un chargement paresseux s'il est improbable que vous utilisiez les documents référencés. Si vous allez toujours les utiliser avec impatience le chargement est probablement mieux, car il vous donne au moins un temps de chargement initial, plutôt que d'avoir des requêtes faites de façon imprévisible plus tard dans le processus. Par le son de ce que vous ne voulez pas charger l'inventaire lorsque vous chargez un joueur si, alors oui, le réglage de FetchType à paresseux devrait résoudre ce problème.

Pendant ce temps, le paramètre cascade vous permet de configurer ce qui arrive aux documents référencés si vous effectuez des opérations (mise à jour, suppression, etc.) sur ce document. Par défaut, les documents référencés doivent être explicitement enregistrés ou supprimés eux-mêmes, vous ne pouvez pas enregistrer le document principal et attendre que les autres soient également enregistrés. Par le son de ce qui est en fait le comportement que vous voulez de toute façon (sinon, enregistrer une modification sur le lecteur va charger et ensuite enregistrer l'inventaire, je crois). Notez également que votre exemple n'est pas réellement valide, selon la documentation, car vous ne pouvez utiliser DocumentReferences que pour faire référence à des ensembles (implémentations réelles de Java Set) d'autres documents, et le vôtre est un Map.

+0

Et si les articles de l'inventaire ne sont pas des documents et que je ne les référence pas? Puis-je charger un joueur sans son champ d'inventaire? Puis-je dire à ektorp de faire ça? Et comment? –

+0

Oui, vous pouvez complètement supprimer le champ d'être inclus dans les documents si vous marquez avec @ @ JsonIgnore. C'est ce que tu veux dire? Si ce ne sont pas des documents et que vous ne voulez pas stocker cette relation dans CouchDB, vous n'avez pas besoin de l'annotation '@ DocumentReferences'. –

+0

Mmmmh non Je voudrais quelque chose comme: Joueur p = db.get (Player.class, "key", new String [] {"inventory"}); pour ignorer l'inventaire de _that_ call.Et seulement cet appel. Est-ce possible ou dois-je charger tout le document tout le temps? –