2014-02-14 16 views
1

使用Hibernate搜索版本V4.5.0,我特林使用类似使用@containedIn和的includepaths

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

,而不是

@IndexedEmbedded(depth = 1) 

在我不需要的所有细节的情况下关联的类,但只有一个或两个字段。我遇到的问题是,关系另一方的@ContainedIn现在似乎没有效果。我认为“includePaths”的意思是让你可以索引超出指定深度范围的信息。如果是这样,当关联实体更改时如何保持主实体索引同步?

更糟糕的是我发现设置includePaths看似无关的条目也打破了我的@containedIn逻辑。

例如“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操作卡仅反映上证指数本身,而不是体现在谁拥有该卡的人物索引。不过,如果我对西服改变​​看似不相关的注释从

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

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

然后,两个卡和个人的entites被更新。

回答

0

“includePaths”不会为给定“深度”以外的信息编制索引,因此您至少需要“深度= 1”才能使“includePaths”正常工作。

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

第66页(物理第58页)在this文件中有详细说明。

+0

对不起,回复迟了,我失去了这个线程跟踪。据我可以看到从文档你可以看到: - 1.深度= 0是有效的*“当使用includePaths,并保持深度未定义,行为等同于设置depth = 0:只有包含的路径索引” * 2.它的索引超出指定的深度。如例4:10所示,*“parents.parents.parents.name”*的索引超出了深度。 我真正的问题是关系的另一方@containedIn不更新它指向的东西的索引。 – user2046211