7.3.3. 添加注解


对于本节,请考虑您拥有包含图书详细信息的数据库的示例。您的应用包含 Hibernate 管理的类 example.Bookexample.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
  ...
}
Copy to Clipboard Toggle word wrap

package example;
...
@Entity
public class Author {

  @Id
  @GeneratedValue
  private Integer id;

  private String name;

  public Author() {}

  // standard getters/setters follow here
  ...
}
Copy to Clipboard Toggle word wrap

要达到此目的,您必须向 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.YESstore=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
  ...
}
Copy to Clipboard Toggle word wrap

package example;
...
@Entity
public class Author {

  @Id
  @GeneratedValue
  private Integer id;

  private String name;

  public Author() {
  }

  // standard getters/setters follow here
  ...
}
Copy to Clipboard Toggle word wrap
返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat