3

我是 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),干杯。

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

4

1 回答 1

1

像这样的文档引用基本上类似于 SQL DB 中的 JOIN,但是您不能像使用 SQL 那样在一个请求中执行 JOIN。相反,您需要先请求获取您要查找的核心文档,然后再请求获取任何参考文档。

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

通常,如果您不太可能使用引用的文档,则需要延迟加载。如果您总是要使用它们,那么急切加载可能会更好,因为它至少可以为您提供一致的前期加载时间,而不是在流程后期出现不可预测的请求。听起来你不想在加载播放器时加载库存,所以是的,将 FetchType 设置为惰性应该可以解决这个问题。

同时 cascade 参数允许您配置如果您对该文档执行操作(更新删除等),引用的文档会发生什么。默认情况下,引用的文档需要自己显式保存或删除,您不能只保存主文档并期望其他文档也被保存。从它的声音来看,这实际上是您想要的行为(否则保存对播放器的更改将加载然后保存库存,我相信)。

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

于 2013-04-12T12:57:53.937 回答