Hibernate search的@ContainedIn跟@IndexedEmbedded
Hibernate search的@ContainedIn和@IndexedEmbedded
IndexedEmbedded用此注解标注的对象为被嵌入对象,比如我在Blog类中有一个Auther auther的属性,当用@IndexedEmbedded标注此属性时,表示可以用auther.(Auther的属性)进行搜索。当@IndexedEmbedded标注的为一个对象,则在此对象中进行搜索,最终返回的是一个对象。当其标注的是一个集合(如Set<Auther> authers)时,则在所有是集合中搜索,返回的可能是多个对象。
@ContainedIn根据官方API的解释是用于维护被嵌入对象的一致性,也就是说,为了维护当上面例子上auther改变时Blog中对应于auther的索引也更新,但在实际运用中,并不会产生这样的效果。
比如当我添加一篇blog时,指定的auther为admin,此时可以根据auther.name为admin搜索出这篇blog。但如果此时把admin改为admins,理论上应该用admins把这篇blog搜索出来,但实际上还是用admin才能把这篇blog搜索出来。所以把admin改为admins只是在Auther中更新了索引,但在Blog中未更新索引,此时的索引需要我们手动去更新此auther对应的所有的Blog。
至此,好像添加@ContainedIn没有启动应有的作用,根据去Hibernate Search官方论坛了解到,即使添加了@ContainedIn也需要开发者去维护双方的索引的一致性。
下面是我用到了两个实体类
IndexedEmbedded用此注解标注的对象为被嵌入对象,比如我在Blog类中有一个Auther auther的属性,当用@IndexedEmbedded标注此属性时,表示可以用auther.(Auther的属性)进行搜索。当@IndexedEmbedded标注的为一个对象,则在此对象中进行搜索,最终返回的是一个对象。当其标注的是一个集合(如Set<Auther> authers)时,则在所有是集合中搜索,返回的可能是多个对象。
@ContainedIn根据官方API的解释是用于维护被嵌入对象的一致性,也就是说,为了维护当上面例子上auther改变时Blog中对应于auther的索引也更新,但在实际运用中,并不会产生这样的效果。
比如当我添加一篇blog时,指定的auther为admin,此时可以根据auther.name为admin搜索出这篇blog。但如果此时把admin改为admins,理论上应该用admins把这篇blog搜索出来,但实际上还是用admin才能把这篇blog搜索出来。所以把admin改为admins只是在Auther中更新了索引,但在Blog中未更新索引,此时的索引需要我们手动去更新此auther对应的所有的Blog。
至此,好像添加@ContainedIn没有启动应有的作用,根据去Hibernate Search官方论坛了解到,即使添加了@ContainedIn也需要开发者去维护双方的索引的一致性。
下面是我用到了两个实体类
@Indexed @Entity @Table(name="blog") public class Blog { private String id; private String title; private String content; private Date createDate; private int sort; private Set<BlogType> blogTypes; private Auther auther; @Id @GeneratedValue(generator = "system-uuid") @GenericGenerator(name="system-uuid", strategy="uuid") @DocumentId public String getId() { return id; } public void setId(String id) { this.id = id; } @Column @Field(name="title",index=Index.TOKENIZED,store=Store.YES) public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } @Column @Field(name="content",index=Index.TOKENIZED,store=Store.NO) public String getContent() { return content; } public void setContent(String content) { this.content = content; } @Column @Field(name="date",index = Index.UN_TOKENIZED, store = Store.YES) @DateBridge(resolution = Resolution.DAY) public Date getCreateDate() { return createDate; } public void setCreateDate(Date createDate) { this.createDate = createDate; } @Field(name="sort",index = Index.UN_TOKENIZED, store = Store.YES) @NumericField @Column public int getSort() { return sort; } public void setSort(int sort) { this.sort = sort; } @OneToMany(mappedBy="blog") public Set<BlogType> getBlogTypes() { return blogTypes; } public void setBlogTypes(Set<BlogType> blogTypes) { this.blogTypes = blogTypes; } @ManyToOne @JoinColumn(name="autherId") @IndexedEmbedded public Auther getAuther() { return auther; } public void setAuther(Auther auther) { this.auther = auther; } }
@Indexed @Entity @Table(name="auther") public class Auther { private String id; private String name; private Set<Blog> blogs; @Id @GeneratedValue(generator = "system-uuid") @GenericGenerator(name="system-uuid", strategy="uuid") @DocumentId public String getId() { return id; } public void setId(String id) { this.id = id; } @Column @Field(name="authername",index=Index.TOKENIZED,store=Store.YES) public String getName() { return name; } public void setName(String name) { this.name = name; } @ContainedIn @OneToMany(mappedBy="auther",cascade = CascadeType.ALL) public Set<Blog> getBlogs() { return blogs; } public void setBlogs(Set<Blog> blogs) { this.blogs = blogs; } }