使用@containedIn和includePaths

时间:2014-02-14 11:08:12

标签: hibernate-search

使用hibernate搜索版本v4.5.0,我想使用像

这样的东西
@IndexedEmbedded(depth = 0, includePaths = {"id", "name"})

而不是

@IndexedEmbedded(depth = 1)

如果我不需要关联类的所有细节,只需要一个或两个字段。我遇到的问题是关系另一边的@ContainedIn现在似乎没有效果。我认为“includePaths”的目的是允许您将信息索引超出指定深度的范围。如果是这样,当关联实体发生变化时,如何保持主要实体索引同步?

更糟糕的是,我发现将seePaths设置为看似无关的条目也会破坏我的@containedIn逻辑。

e.g。 “Person”对象包含一组“Card”对象。

public class Person {
  ...
  @IndexedEmbedded(depth = 1)
  private Set<Card> cards = new HashSet<Card>(0);
  ...
}

“卡片”对象的类型为“套装”。

public class Card {
  ...
  private Person person;

  @Field
  private String cardName;//e.g. jack, queen, king

  @IndexedEmbedded(depth = 0, includePaths = {"id"})//????????????
  private Suit suit;//e.g. hearts, diamonds

  ...
  @ContainedIn
  public Person getPerson() {
    return this.person;
  }
}

使用上面的代码,对卡的CRUD操作仅反映在卡索引本身上,但不反映在拥有该卡的Person索引中。但是,如果我从

更改看似无关的套装注释
@IndexedEmbedded(depth = 0, includePaths = {"id"})

@IndexedEmbedded(depth = 1, includePaths = {"id"})

然后卡片和人物都会更新。

1 个答案:

答案 0 :(得分:0)

“includePaths”不会将信息编入超出给定“深度”的索引,因此您需要至少使用“depth = 1”才能使“includePaths”正常工作。

由于您使用“includePaths”,因此只会将您指定的路径编入索引,我认为这就是您想要的。

this文件中的第66页(实物页面58)详细解释了这一点。