有人可以解释我在Ektorp的Cascading和FetchType懒惰吗?

时间:2013-04-12 11:37:39

标签: java nosql couchdb ektorp

我是CouchDB和Ektorp的新手(我今天开始尝试使用它)。我发现的最详细的文档可以帮助我入门:

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

我的用例是我想将一个非常复杂的类保存为文档(到目前为止我已经管理过),但我不想一直加载所有字段(因为其中一些是潜在的大集合其他更简单的文件)。

这是我的一个例子(它只是我用来学习使用Ektorp和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
}

我设法保存它并通过id得到它就好了。但是如何在不加载库存的情况下获得它呢? 我也很感激任何其他资源的链接我应该检查开始使用couchdb或ektorp与java(或scala),欢呼。

感谢您提供任何有用的答案。

1 个答案:

答案 0 :(得分:1)

这些文档引用基本上与SQL DB中的JOIN类似,但是您不能像在SQL中那样在一个请求中执行JOIN。相反,您需要首先请求获取您正在寻找的核心文档,然后再获取第二个获取任何引用文档的请求。

将FetchType设置为eager告诉Ektorp在您读取第一个文档后立即执行此操作,因此会立即为所有引用的文档发出一系列请求,确保在开始使用之前加载所有内容。 FetchType lazy不执行此操作,而是在尝试使用它们之前忽略引用的文档。

一般来说,如果您不太可能使用引用的文档,则需要延迟加载。如果您总是要使用它们,那么渴望加载可能更好,因为它至少可以为您提供一致的前期加载时间,而不是在此过程的后期无法预测请求。根据它的声音,你不想在加载播放器时加载库存,所以是的,将FetchType设置为lazy应该可以解决这个问题。

同时,如果您对此文档执行操作(更新删除等),则使用cascade参数可以配置引用文档的内容。默认情况下,需要自己明确保存或删除引用文档,不仅可以保存主文档,还可以保存其他文档。通过它的声音,这实际上是你想要的行为(因为否则保存对玩家的更改将加载然后保存库存,我相信)。

另外,根据文档,您应该注意到您的示例实际上并不有效,因为您只能使用DocumentReferences来引用其他文档的集合(实际的真实Java集实现),而您的是一个Map。