Hibernate Search 在多租户 Spring 引导应用程序中初始化索引
Hibernate Search initialise index in multi-tenant Spring Boot application
我有一个使用 Hibernate 的 Spring 启动应用程序,我正在向它添加 Hibernate Search。该应用程序将模式分离的多租户与 Hibernate 结合使用,实现 MultiTenantConnectionProvider
和 CurrentTenantIdentifierResolver
我想在应用程序启动时创建初始搜索索引(或重新索引),以便能够搜索现有数据。
这是进行索引的服务:
@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();
}
}
}
但问题是我不知道在哪里调用这个服务。因为它基于 EntityManager
而不是 DataSource
,所以它似乎与单个租户(数据库模式)相关联。有没有办法为整个数据库创建索引?如果是这样,在哪里调用它?
本质上,您需要为每个租户打开不同的会话(实体管理器)。您不能使用单个 cross-tenant 质量索引器,因为这违背了 multi-tenancy 的概念:严格分离对每个租户数据的访问。
我不知道使用 Spring 引导正确执行此操作的确切方法,但您的代码将如下所示:
@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
}
}
我有一个使用 Hibernate 的 Spring 启动应用程序,我正在向它添加 Hibernate Search。该应用程序将模式分离的多租户与 Hibernate 结合使用,实现 MultiTenantConnectionProvider
和 CurrentTenantIdentifierResolver
我想在应用程序启动时创建初始搜索索引(或重新索引),以便能够搜索现有数据。
这是进行索引的服务:
@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();
}
}
}
但问题是我不知道在哪里调用这个服务。因为它基于 EntityManager
而不是 DataSource
,所以它似乎与单个租户(数据库模式)相关联。有没有办法为整个数据库创建索引?如果是这样,在哪里调用它?
本质上,您需要为每个租户打开不同的会话(实体管理器)。您不能使用单个 cross-tenant 质量索引器,因为这违背了 multi-tenancy 的概念:严格分离对每个租户数据的访问。
我不知道使用 Spring 引导正确执行此操作的确切方法,但您的代码将如下所示:
@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
}
}