使用 Infinispan 和 Wildfly 配置 Hibernate 搜索
Configuring Hibernate Search with Infinispan and Wildfly
我正在配置 Hibernate Search 5.5.5 以在 Wildfly 10 上使用 Infinispan 8.2.2。
我在 Wildfly 中只配置了 Infinispan 模块,没有配置 Hibernate Search 模块。
里面的persistence.xml我是这样配置的:
<property name="hibernate.search.infinispan.cachemanager_jndiname" value="java:jboss/infinispan/container/hibernateSearch" />
<property name="wildfly.jpa.hibernate.search.module" value="none" />
这是因为似乎使用了 Infinispan,但并未保留索引。
所有缓存在domain.xml中配置如下:
<cache-container name="hibernateSearch" default-cache="LuceneIndexesData" jndi-name="java:jboss/infinispan/hibernateSearch" statistics-enabled="false">
<replicated-cache name="LuceneIndexesMetadata" mode="ASYNC">
<file-store fetch-state="false" passivation="false" preload="false" purge="false" shared="false" singleton="false"/>
</replicated-cache>
<replicated-cache name="LuceneIndexesLocking" mode="SYNC">
<file-store fetch-state="false" passivation="false" preload="false" purge="false" shared="false" singleton="false"/>
</replicated-cache>
<replicated-cache name="LuceneIndexesData" mode="ASYNC">
<file-store fetch-state="false" passivation="false" preload="false" purge="false" shared="false" singleton="false"/>
</replicated-cache>
</cache-container>
在jboss-部署-structure.xml:
<module name="org.infinispan" slot="ispn-8.2"/>
<module name="org.hibernate.search.orm" services="export" />
当我尝试索引所有内容时收到此错误:
UNHANDLED_EXCEPTION: java.lang.IllegalArgumentException: java.lang.Object is not an indexed entity or a subclass of an indexed entity
但是如果我删除这一行:
<property name="wildfly.jpa.hibernate.search.module" value="none" />
我得到了
org.hibernate.search.exception.SearchException: Wrong configuration of directory provider: class org.infinispan.hibernate.search.spi.InfinispanDirectoryProvider does not implement interface org.hibernate.search.store.DirectoryProvider
问题似乎与此处描述的相同:
https://developer.jboss.org/thread/271789
但我没有找到任何可行的解决方案,而且我确定我的类路径中没有一个或多个 Infinispan 或 Hibernate 版本。
怎么了? :(
TLDR; You are having 2 Infinispan versions in your classpath: one in your jboss-deployment-structure.xml
and one coming with org.jboss.as.clustering
subsystem.
自定义休眠搜索
<property name="wildfly.jpa.hibernate.search.module" value="none" />
只是意味着 不会自动 使用和导出 应用程序服务器 "search" 模块用于我的应用程序 。
因此,<module name="org.hibernate.search.orm" services="export" />
是多余的,只要您为 wildfly.jpa.hibernate.search.module
输入正确的模块 ID 而不是 none
或只是删除 属性 使用默认搜索模块。
none
选项适用于以下情况:您不想使用默认或自定义搜索模块,而是将其捆绑在您的应用程序中。
更多详情WildFly 10 Docs - Using Hibernate Search
自定义 WildFly Infinispan 子系统
<module name="org.infinispan" slot="ispn-8.2"/>
不升级 WildFly Infinispan 子系统。它只允许您的应用程序直接使用 Infinispan 作为库。正确的方法是:
- 简单:升级到 Wildfly 10.1(它默认带有 Infinispan 8.2 和 Hibernate Search 5.5)
- 困难:升级或修改
org.jboss.as.clustering.infinispan
模块以使用自定义 Infinispan 版本
- 荒谬:转储 WildFly 提供的缓存基础结构并使用您自己的捆绑并在应用程序中配置
我正在配置 Hibernate Search 5.5.5 以在 Wildfly 10 上使用 Infinispan 8.2.2。 我在 Wildfly 中只配置了 Infinispan 模块,没有配置 Hibernate Search 模块。
里面的persistence.xml我是这样配置的:
<property name="hibernate.search.infinispan.cachemanager_jndiname" value="java:jboss/infinispan/container/hibernateSearch" />
<property name="wildfly.jpa.hibernate.search.module" value="none" />
这是因为似乎使用了 Infinispan,但并未保留索引。
所有缓存在domain.xml中配置如下:
<cache-container name="hibernateSearch" default-cache="LuceneIndexesData" jndi-name="java:jboss/infinispan/hibernateSearch" statistics-enabled="false">
<replicated-cache name="LuceneIndexesMetadata" mode="ASYNC">
<file-store fetch-state="false" passivation="false" preload="false" purge="false" shared="false" singleton="false"/>
</replicated-cache>
<replicated-cache name="LuceneIndexesLocking" mode="SYNC">
<file-store fetch-state="false" passivation="false" preload="false" purge="false" shared="false" singleton="false"/>
</replicated-cache>
<replicated-cache name="LuceneIndexesData" mode="ASYNC">
<file-store fetch-state="false" passivation="false" preload="false" purge="false" shared="false" singleton="false"/>
</replicated-cache>
</cache-container>
在jboss-部署-structure.xml:
<module name="org.infinispan" slot="ispn-8.2"/>
<module name="org.hibernate.search.orm" services="export" />
当我尝试索引所有内容时收到此错误:
UNHANDLED_EXCEPTION: java.lang.IllegalArgumentException: java.lang.Object is not an indexed entity or a subclass of an indexed entity
但是如果我删除这一行:
<property name="wildfly.jpa.hibernate.search.module" value="none" />
我得到了
org.hibernate.search.exception.SearchException: Wrong configuration of directory provider: class org.infinispan.hibernate.search.spi.InfinispanDirectoryProvider does not implement interface org.hibernate.search.store.DirectoryProvider
问题似乎与此处描述的相同:
https://developer.jboss.org/thread/271789
但我没有找到任何可行的解决方案,而且我确定我的类路径中没有一个或多个 Infinispan 或 Hibernate 版本。
怎么了? :(
TLDR; You are having 2 Infinispan versions in your classpath: one in your
jboss-deployment-structure.xml
and one coming withorg.jboss.as.clustering
subsystem.
自定义休眠搜索
<property name="wildfly.jpa.hibernate.search.module" value="none" />
只是意味着 不会自动 使用和导出 应用程序服务器 "search" 模块用于我的应用程序 。
因此,<module name="org.hibernate.search.orm" services="export" />
是多余的,只要您为 wildfly.jpa.hibernate.search.module
输入正确的模块 ID 而不是 none
或只是删除 属性 使用默认搜索模块。
none
选项适用于以下情况:您不想使用默认或自定义搜索模块,而是将其捆绑在您的应用程序中。
更多详情WildFly 10 Docs - Using Hibernate Search
自定义 WildFly Infinispan 子系统
<module name="org.infinispan" slot="ispn-8.2"/>
不升级 WildFly Infinispan 子系统。它只允许您的应用程序直接使用 Infinispan 作为库。正确的方法是:
- 简单:升级到 Wildfly 10.1(它默认带有 Infinispan 8.2 和 Hibernate Search 5.5)
- 困难:升级或修改
org.jboss.as.clustering.infinispan
模块以使用自定义 Infinispan 版本 - 荒谬:转储 WildFly 提供的缓存基础结构并使用您自己的捆绑并在应用程序中配置