Hibernate搜索@IndexedEmbedded

时间:2011-09-14 15:36:24

标签: java hibernate lucene hibernate-search

我遇到类似this one

的情况
@Entity
@Indexed
public class Place {
    @Id
    @GeneratedValue
    @DocumentId
    private Long id;

    @Field( index = Index.TOKENIZED )
    private String name;

    @OneToOne( cascade = { CascadeType.PERSIST, CascadeType.REMOVE } )
    @IndexedEmbedded
    private Address address;
    ....
}

@Entity
public class Address {
    @Id
    @GeneratedValue
    private Long id;

    @Field(index=Index.TOKENIZED)
    private String street;

    @Field(index=Index.TOKENIZED)
    private String city;

    @ContainedIn
    @OneToMany(mappedBy="address")
    private Set<Place> places;
    ...
}

现在的问题如下: 如果我更改实体 Place 中的 name 字段,哪些实体将被重新编入索引?

1)只有名称字段?

2)整个 Place 实体?

3)整个 Place 实体和用 @IndexedEmbedded 注释的实体?

我需要的是第三个。因此,如果它不是标准的,是否可以有任何解决方案来实现这种行为?

2 个答案:

答案 0 :(得分:4)

幸运的是,它确实是第三个,所以我很幸运,它按预期工作

答案 1 :(得分:0)

您可以使用以下代码手动重新索引场所实体

public void updateIndex(T entity){
        FullTextEntityManager fullTextEntityManager = Search.getFullTextEntityManager(em);
        fullTextEntityManager.index(entity);
        fullTextEntityManager.getSearchFactory().optimize(entity.getClass());
    }

其次,如果您正在使用hibernate,您可以在persistence.xml中配置lucene以自动更新已更改实体的索引