![](/img/trans.png)
[英]spring data JPA & spring data elasticsearch; No property index found for type?
[英]Bulkindexing JPA Entities modified during Spring transaction to Elasticsearch index
我有一个JPA实体类,它也是一个Elasticsearch文档。 该环境是一个使用Spring Data Jpa和Spring Data Elasticsearch的Spring Boot应用程序。
@Entity
@Document(indexname...etc)
@EntityListeners(MyJpaEntityListener.class)
public class MyEntity {
//ID, constructor and stuff following here
}
创建,更新或删除此实体的实例时,会将其重新索引到Elasticsearch。 当前,这是通过对PostPersist,PostUpdate和PostRemove事件做出反应的JPA EntityListener来实现的。
public class MyJpaEntityListener {
@PostPersist
@PostUpdate
public void postPersistOrUpdate(MyEntity entity) {
//Elasticsearch indexing code gets here
}
@PostRemove
public void postPersistOrUpdate(MyEntity entity) {
//Elasticsearch indexing code gets here
}
}
当在单个事务中修改单个或几个实体时,一切都很好。 每次修改都会触发单独的索引操作。 但是,如果许多实体在事务内被修改,它将变得很慢。
我想对在事务结束时(或提交后)修改过的所有实体进行批量索引。 我看了一下TransactionalEventListeners,AOP和TransactionSynchronizationManager,但是到目前为止,还没有一个好的设置。
如何以一种优雅的方式收集每个事务的所有已修改实体,而无需自己亲自处理每种服务方法?
以及如何在事务结束时使用该事务的已收集实体触发bulkindex。
感谢您的时间和帮助!
我不认为服务和实体与Elasticsearch相关代码混合使用,这是一种与众不同的优雅方法,即在服务层事务处理方法中将spring方面与@AfterReturning一起使用。
可以调整切入点表达式以捕获所需的所有服务方法。
@Order(1)保证该代码将在事务提交后运行。
下面的代码只是一个示例...您必须对其进行调整以适合您的项目。
@Aspect
@Component()
@Order(1)
public class StoreDataToElasticAspect {
@Autowired
private SampleElasticsearhRepository elasticsearchRepository;
@AfterReturning(pointcut = "execution(* com.example.DatabaseService.bulkInsert(..))")
public void synonymsInserted(JoinPoint joinPoint) {
Object[] args = joinPoint.getArgs();
//create elasticsearch documents from method params.
//can also inject database services if more information is needed for the documents.
List<String> ids = (List) args[0];
//create batch from ids
elasticsearchRepository.save(batch);
}
}
这是一个有关日志记录方面的示例 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.