Hibernate Search 在多租户 Spring Boot 应用程序中初始化索引

安科夫

我有一个使用 Hibernate 的 Spring Boot 应用程序,我正在向它添加 Hibernate Search。该应用程序在 Hibernate 中使用模式分离的多租户,实现MultiTenantConnectionProviderCurrentTenantIdentifierResolver

我想在应用程序启动时创建初始搜索索引(或重新索引),以便能够搜索现有数据。

这是进行索引的服务:

@Service
public class SearchService {

    @PersistenceContext
    private EntityManager entityManager;

    @Transactional
    public void initializeSearchIndex() {

        try {
            FullTextEntityManager fullTextEntityManager = Search.getFullTextEntityManager(entityManager);
            fullTextEntityManager.createIndexer().startAndWait();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

但问题是我不知道在哪里调用这个服务。因为它适用于 anEntityManager而不是 a DataSource,所以它似乎绑定到单个租户(db 模式)。有没有办法为整个数据库创建索引?如果是这样,在哪里调用它?

罗迪埃

本质上,您需要为每个租户打开一个不同的会话(实体管理器)。您不能使用单一的、跨租户的质量索引器,因为这违背了多租户的概念:严格分离对每个租户数据的访问。

我不知道使用 Spring boot 正确执行此操作的确切方法,但您的代码将如下所示:

@Service
public class SearchService {

    @PersistenceUnit
    private EntityManagerFactory entityManagerFactory;

    public void initializeSearchIndex() {
        SessionFactory sessionFactory = entityManagerFactory.unwrap(SessionFactory.class);
        for (String tenantId : getAllTenantIds()) {
            try (Session session = sessionFactory.withOptions().tenantIdentifier(tenantId).openSession()) {
                FullTextEntityManager fullTextEntityManager = Search.getFullTextEntityManager(session);
                fullTextEntityManager.createIndexer().startAndWait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    List<String> getAllTenantIds() {
         // return all tenant Ids
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Spring Boot + Hibernate + Oracle模式多租户

Spring Boot中的多租户

Spring Boot + Hibernate多租户:@Transactional无法正常工作

Spring Boot的多租户

使用Spring MVC和Hibernate在多租户数据库应用程序中动态添加租户

如何在Spring Boot中实现Redis的多租户

具有Spring Boot和Hibernate的多租户和中央数据库

Spring Boot + Spring Data多租户

Hibernate Search索引单个租户

使用Spring,Hibernate和C3P0在多租户Web应用程序中管理连接池

Spring boot - 在多租户应用程序中的单个请求中访问多个数据源

如何实现Spring Boot Redis多租户?

每个架构问题的 Spring Boot 多租户

Hibernate 4多租户和Spring 3 Hibernate

在Hibernate多租户配置中禁用Spring数据源配置

如何在支持多租户(每个租户数据库)的Spring Boot应用程序中使用固定数据库

Spring Boot应用程序中的Spring初始化器

如何实现多租户Spring Boot应用程序(每个用户都有自己的数据库)

使用Spring + Hibernate进行多租户:“为多租户配置了SessionFactory,但未指定租户标识符”

在 Spring Boot 中记录 Hibernate

带有 Hibernate Search 的 Spring Boot 2,保存时不会创建索引

在将Spring / Hibernate应用程序部署到glassfish SessionFactoy初始化期间失败NullPointerException

在Spring Boot应用程序中使用Liquibase初始化内存中的H2以进行单元测试

如何使用JPA在Hibernate 4中启用多租户?

无法在 Spring Boot Hibernate Search Elasticsearch 中配置我自己的分析器

无法从 Spring Boot 应用程序初始化数据库连接

如何在Spring Boot应用程序的main方法中正确初始化Bean?

如何使用Spring Boot应用程序初始化log4j?

Spring Boot应用程序即服务。系统V初始化