通过注释替代 Hibernate 搜索映射实体
Alternatives to Hibernate Search mapping Entities through annotations
据我所知,没有 XML 替代方法 可以为 Hibernate Search 映射实体。不过,使用 XML 配置进行搜索可能不是一个好主意。但在我的具体情况下,我有一个 gradle 多模块 Spring 项目,例如 -
- common : 包含通用实体和服务
- 爬虫:它使用公共实体并有自己的服务
- search : 这也使用公共实体并包含搜索相关服务
这不是一个单独的项目,而是我从中生成单独的 war,例如 crawler.war 或 search.war。所以你看我需要为所有单独的模块使用公共实体,因此单独生成 war。因此,不应期望直接在公共实体中使用 Hibernate Search 映射注释。
现在我想知道有什么方法可以在将公共实体导入搜索模块时为其注入 Hibernate 搜索注释?
[非常感谢任何其他与项目结构相关的建议或意见]
提前致谢。
如文档中所述,您可以使用 programmatic mapping API.
基本上,在您的 "search" 项目中,您必须编写 class 定义映射:
public class MyAppSearchMappingFactory {
@Factory
public SearchMapping getSearchMapping() {
SearchMapping mapping = new SearchMapping();
mapping
.analyzerDef( "en", StandardTokenizerFactory.class )
.filter( LowerCaseFilterFactory.class )
.filter( EnglishPorterFilterFactory.class )
.entity(Address.class).indexed()
.property("addressId", ElementType.METHOD)
.documentId()
.name("id")
.property("street1", ElementType.METHOD)
.field()
.analyzer("en")
.store(Store.YES)
.field()
.name("address_data")
.analyzer("en");
return mapping;
}
}
然后将 Hibernate Search 配置为使用此 class 作为映射的源,如下所示。
如果您使用 .properties
文件进行 Hibernate 相关配置:
hibernate.search.model_mapping = com.acme.MyAppSearchMappingFactory
如果您使用 persistence.xml
文件进行 Hibernate 相关配置:
<persistence ...>
<persistence-unit name="...">
...
<properties>
<property name="hibernate.search.model_mapping"
value="com.acme.MyAppSearchMappingFactory"/>
</properties>
</persistence-unit>
</persistence>
据我所知,没有 XML 替代方法 可以为 Hibernate Search 映射实体。不过,使用 XML 配置进行搜索可能不是一个好主意。但在我的具体情况下,我有一个 gradle 多模块 Spring 项目,例如 -
- common : 包含通用实体和服务
- 爬虫:它使用公共实体并有自己的服务
- search : 这也使用公共实体并包含搜索相关服务
这不是一个单独的项目,而是我从中生成单独的 war,例如 crawler.war 或 search.war。所以你看我需要为所有单独的模块使用公共实体,因此单独生成 war。因此,不应期望直接在公共实体中使用 Hibernate Search 映射注释。
现在我想知道有什么方法可以在将公共实体导入搜索模块时为其注入 Hibernate 搜索注释?
[非常感谢任何其他与项目结构相关的建议或意见]
提前致谢。
如文档中所述,您可以使用 programmatic mapping API.
基本上,在您的 "search" 项目中,您必须编写 class 定义映射:
public class MyAppSearchMappingFactory {
@Factory
public SearchMapping getSearchMapping() {
SearchMapping mapping = new SearchMapping();
mapping
.analyzerDef( "en", StandardTokenizerFactory.class )
.filter( LowerCaseFilterFactory.class )
.filter( EnglishPorterFilterFactory.class )
.entity(Address.class).indexed()
.property("addressId", ElementType.METHOD)
.documentId()
.name("id")
.property("street1", ElementType.METHOD)
.field()
.analyzer("en")
.store(Store.YES)
.field()
.name("address_data")
.analyzer("en");
return mapping;
}
}
然后将 Hibernate Search 配置为使用此 class 作为映射的源,如下所示。
如果您使用
.properties
文件进行 Hibernate 相关配置:hibernate.search.model_mapping = com.acme.MyAppSearchMappingFactory
如果您使用
persistence.xml
文件进行 Hibernate 相关配置:<persistence ...> <persistence-unit name="..."> ... <properties> <property name="hibernate.search.model_mapping" value="com.acme.MyAppSearchMappingFactory"/> </properties> </persistence-unit> </persistence>