同様のやり方は、保存メソッドのカスタムリポジトリ実装を作成することです。リポジトリの
インタフェース:
public interface FooRepository extends SolrCrudRepository<Foo, String>, FooRepositoryCustom {
}
インタフェースのカスタム上書き用:カスタムオーバーライドの
public interface FooRepositoryCustom {
public Foo save(Foo entity);
public Iterable<Foo> save(Iterable<Foo> entities);
}
実装:
public class FooRepositoryImpl {
private SolrOperations solrOperations;
public SolrSampleRepositoryImpl(SolrOperations fooSolrOperations) {
this.solrOperations = fooSolrOperations;
}
@Override
public Foo save(Foo entity) {
Assert.notNull(entity, "Cannot save 'null' entity.");
registerTransactionSynchronisationIfSynchronisationActive();
this.solrOperations.saveBean(entity, 1000);
commitIfTransactionSynchronisationIsInactive();
return entity;
}
@Override
public Iterable<Foo> save(Iterable<Foo> entities) {
Assert.notNull(entities, "Cannot insert 'null' as a List.");
if (!(entities instanceof Collection<?>)) {
throw new InvalidDataAccessApiUsageException("Entities have to be inside a collection");
}
registerTransactionSynchronisationIfSynchronisationActive();
this.solrOperations.saveBeans((Collection<? extends T>) entities, 1000);
commitIfTransactionSynchronisationIsInactive();
return entities;
}
private void registerTransactionSynchronisationIfSynchronisationActive() {
if (TransactionSynchronizationManager.isSynchronizationActive()) {
registerTransactionSynchronisationAdapter();
}
}
private void registerTransactionSynchronisationAdapter() {
TransactionSynchronizationManager.registerSynchronization(SolrTransactionSynchronizationAdapterBuilder
.forOperations(this.solrOperations).withDefaultBehaviour());
}
private void commitIfTransactionSynchronisationIsInactive() {
if (!TransactionSynchronizationManager.isSynchronizationActive()) {
this.solrOperations.commit();
}
}
}
とあなたもSolrOperationsを提供する必要があります右ソルコアのための豆:
@Configuration
public class FooSolrConfig {
@Bean
public SolrOperations getFooSolrOperations(SolrClient solrClient) {
return new SolrTemplate(solrClient, "foo");
}
}
脚注:自動コミットは、概念的にはトランザクションとは互換性がありません。自動コミットは、solrが一定の時間内にディスクに書き込もうと試みるという約束です。多くのことが実際には起こらないかもしれませんが、タイムリーな電源やハードウェアの障害、ドキュメントとスキーマ間のエラーなどです。しかし、クライアントはsolrが約束を守らなかったことを知りません。それは実際には失敗しました。