![](/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.