ここでは春のドキュメントhttp://docs.spring.io/spring-data/data-jpa/docs/current/reference/html/repositories.html#repositories.custom-implementationsは、すべてのリポジトリまたは単一のリポジトリにカスタム機能を追加する例を示します。Spring Jpaはすべてのリポジトリに同時にカスタム機能を追加します。
カスタムリポジトリファクトリBeanを使用してすべてのリポジトリにカスタムファンクションを追加し、単一のリポジトリのみにカスタムファンクションを追加するとします(ドキュメントにはカスタムインターフェイスとカスタムImplを使用します)。どうすればこれを達成できますか?
私が "setCurrentTenansInSession"メソッドをすべてのリポジトリに追加したコード例です。カスタムメソッドを追加したいと思います"newCustomMethod"を単一のリポジトリ(MyJpaRepository、私のカスタムリポジトリファクトリの場合)に渡します。これはどうすればいいですか?
カスタム行動インターフェース:
@NoRepositoryBean
public interface MyJpaRepository<T, ID extends Serializable> extends JpaRepository<T, ID> {
public void setCurrentTenantInSession(Object object);
}
カスタム動作の実装:
public class MultiTenantSimpleJpaRepository<T, ID extends Serializable> extends SimpleJpaRepository<T, ID> implements MyJpaRepository<T, ID> {
public void setCurrentTenantInSession(Object object) {
//custom impl
}
}
カスタムリポジトリ工場豆:
public class MultiTenantJpaRepositoryFactoryBean<T extends Repository<S, ID>, S, ID extends Serializable> extends JpaRepositoryFactoryBean<T, S, ID> {
@Override
protected RepositoryFactorySupport createRepositoryFactory(EntityManager entityManager) {
return new MultiTenantJpaRepositoryFactory(entityManager);
}
}
そして最後にカスタムリポジトリ工場:
public class MultiTenantJpaRepositoryFactory extends JpaRepositoryFactory {
public MultiTenantJpaRepositoryFactory(EntityManager entityManager) {
super(entityManager);
}
@Override
protected JpaRepository<?, ?> getTargetRepository(RepositoryMetadata metadata, EntityManager entityManager) {
final JpaEntityInformation<?, Serializable> entityInformation = getEntityInformation(metadata.getDomainType());
final SimpleJpaRepository<?, ?> repo = new MultiTenantSimpleJpaRepository(entityInformation, entityManager);
repo.setLockMetadataProvider(LockModeRepositoryPostProcessor.INSTANCE.getLockMetadataProvider());
return repo;
}
@Override
protected Class<?> getRepositoryBaseClass(RepositoryMetadata metadata) {
return MultiTenantSimpleJpaRepository.class;
}
}
ありがとうkkamenev! – lincetto
'spring-data-commons'の時点で、' jpa:repositories'の 'factory-class'属性の代わりに' base-class = "com.example.CommonCustomRepositoryImpl" 'を指定してください。基底クラスを指定するときは、ファクトリは不要です。 –