7.3.3. 添加注解
对于本节,请考虑您拥有包含图书详细信息的数据库的示例。您的应用包含 Hibernate 管理的类 example.Book 和 example.Author,您想要为您的应用添加免费文本搜索功能以启用搜索图书。
示例:在添加 Hibernate 搜索特定注释前实体书和授权
package example;
...
@Entity
public class Book {
@Id
@GeneratedValue
private Integer id;
private String title;
private String subtitle;
@ManyToMany
private Set<Author> authors = new HashSet<Author>();
private Date publicationDate;
public Book() {}
// standard getters/setters follow here
...
}
package example;
...
@Entity
public class Author {
@Id
@GeneratedValue
private Integer id;
private String name;
public Author() {}
// standard getters/setters follow here
...
}
要达到此目的,您必须向 Book 和 Author 类添加一些注释。第一个注释 @Indexed 将 Book 标记为可索引。按照设计,Hibernate Search 在索引中存储一个未描述的 ID,以确保给定实体的索引不可变。@DocumentId 标记用于此目的的属性,并且在大多数情况下与数据库主密钥相同。如果存在 @Id 注释,则 注释是可选的。
@Document Id
接下来,您要使可搜索的字段必须标记为。在本例中,以标题 和副 标题 开头,并以@Field 标注。参数 index=Index.YES 将确保对文本进行索引,而 analyze=Analyze.YES 则确保将使用默认的 Lucene 分析器分析文本。通常,分析意味着将句子划分为单个单词,并可能排除诸如 "a"或. “”我们稍后将深入探讨分析器。我们在 @Field (storage=Store.NO )中指定的第三个参数确保实际数据不会存储在索引中。此数据存储在索引中是否与搜索它的能力无关。从 Lucene 的角度来看,在索引创建后不需要保留数据。存储它的好处是能够通过预测来检索。
如果不进行预测,Hibernate Search 默认为执行 Lucene 查询,以查找符合查询条件的实体的数据库标识符,并使用这些标识符从数据库中检索受管对象。对预测或预测的决定必须逐例做出。建议使用默认行为,因为它返回受管对象,而 仅返回对象数组。请注意,index=Index.YES,analyze=Analyze.YES 和 store=Store.NO 是这些参数的默认值,可以省略。
尚未讨论的另一个注释是 @DateBridge。此注释是 Hibernate Search 中的内置字段桥之一。Lucene 索引纯粹基于字符串。因此,Hibernate Search 必须将索引字段的数据类型转换为字符串,反之亦然。提供了一系列预定义的网桥,包括 DateBridge,它使用指定的解析将 java.util.Date 转换为字符串。如需了解更多详细信息,请参阅网桥。
这将为我们保留 @IndexedEmbedded。此注释用于为所属实体(@ManyToMany、@*ToOne、@Embedded 和 @ElementCollection)索引关联实体。这是必要的,因为 Lucene 索引文档是一个扁平数据结构,它不知道对象关系。为确保作者姓名可以搜索,您必须确保将姓名作为本书本身的一部分进行索引。在 @IndexedEmbedded 的顶部,您还必须标记您希望在 @Indexed 索引中包含的关联实体的所有字段。如需了解更多详细信息,请参阅嵌入式对象和关联对象。
这些设置现在应该已足够。有关实体映射的详情,请参阅映射实体。
示例:添加 Hibernate 搜索注解后的实体
package example;
...
@Entity
public class Book {
@Id
@GeneratedValue
private Integer id;
private String title;
private String subtitle;
@Field(index = Index.YES, analyze=Analyze.NO, store = Store.YES)
@DateBridge(resolution = Resolution.DAY)
private Date publicationDate;
@ManyToMany
private Set<Author> authors = new HashSet<Author>();
public Book() {
}
// standard getters/setters follow here
...
}
package example;
...
@Entity
public class Author {
@Id
@GeneratedValue
private Integer id;
private String name;
public Author() {
}
// standard getters/setters follow here
...
}