Hibernate搜索:MassIndexer和缺少CDI作用域

Hibernate搜索:MassIndexer和缺少CDI作用域,hibernate,jpa,cdi,hibernate-search,Hibernate,Jpa,Cdi,Hibernate Search,我正在使用hibernate搜索并运行MassIndexer,如下所示: FullTextEntityManager ftem = Search.getFullTextEntityManager(entityManager); ftem.createIndexer().startAndWait(); MassIndexer线程中缺少cdi作用域的问题出现在两个地方: javax.persistence.PostLoad @PostLoad void onPostLoad(Object o) {

我正在使用hibernate搜索并运行MassIndexer,如下所示:

FullTextEntityManager ftem = Search.getFullTextEntityManager(entityManager);
ftem.createIndexer().startAndWait();
MassIndexer线程中缺少cdi作用域的问题出现在两个地方:

javax.persistence.PostLoad

@PostLoad
void onPostLoad(Object o) {
   // cdi-scope aware code
}
org.hibernate.search.bridge.FieldBridge

class MyFieldBridge implements FieldBridge {
   public void set(...) {
      // cdi-scope aware code
   }
}

是否可以使用定义的CDI作用域(例如通过Apache Deltaspike)丰富MassIndexer线程?

我不确定我是否理解正确,但我相信您在字段桥接器中使用CDI bean,并且这些CDI bean的作用域既不是“应用程序”也不是“单例”

据我所知,没有办法自定义mass indexer如何启动线程,也没有办法围绕mass indexer的执行来包装自定义代码,所以我认为没有一种明显的方法可以实现您想要的

如果您从API的角度对需要什么有一个精确的想法,您可以打开一张详细描述它的票据。如果您对某些编码感兴趣,我们也热烈欢迎您使用补丁;)

关于非显而易见的解决方案:

  • HibernateSearch5.9+提供了一个JSR-352(Java应用程序批处理)集成,允许您运行大规模索引JSR-352作业。该集成特别适用于JBeret,它在Weld内部运行,并在自定义CDI范围内执行海量索引代码。您可能可以自定义它来执行您想要的操作
  • CDI实现中可能有一些事务作用域,当Hibernate ORM打开事务时会自动激活。如果是这样的话(我真的不知道是否是这样),您可能能够在事务作用域被激活而您的作用域尚未激活时自动激活所需的作用域。真是一个黑暗中的镜头,但谁知道
此外,您可能想问自己,为什么需要在字段桥中使用非应用程序、非单例作用域,因为不管是谁请求执行字段桥,字段桥的作用都应该是相同的:您可能不希望每次不同的用户更改某个实体时,该实体的索引都会有所不同。。。你可能有你的理由,但你最好检查一下这些理由是否真的很好