java - 如何在自定义 Spring Data JPA 存储库中注入(inject)配置

标签 java spring repository spring-data-jpa

我想根据 JPA batch inserts with Hibernate & Spring Data 中的代码添加自定义批量保存方法到我的应用程序中的所有 Spring Data JPA 存储库。 Spring Data doc explains how this can be done使用自定义存储库基类,如下所示。我的问题是如何在下面的示例中设置 batchSize 属性。如下所示的 @Value 注入(inject)不起作用。

@NoRepositoryBean
public interface BulkRepository<T, ID extends Serializable>
  extends JpaRepository<T, ID> {

  void bulkSave(Iterable<T> entities);
}

public class BulkRepositoryImpl<T, ID extends Serializable> extends SimpleJpaRepository<T, ID> implements BulkRepository<T, ID> {

  private final EntityManager entityManager;

  @Value("${spring.jpa.properties.hibernate.jdbc.batch_size}")
  private int batchSize;

  public BulkRepositoryImpl(JpaEntityInformation entityInformation,
                          EntityManager entityManager) {
    super(entityInformation, entityManager);   
     this.entityManager = entityManager;
  }

  public void bulkSave(Iterable<T> entities) {
    // implementation using batchSize goes here
  }
}

我是否必须使用自定义 JpaRepositoryFactoryBean 来构建已配置的 BulkRepositoryImpl?或者有更直接的方法吗?

最佳答案

我遇到了完全相同的问题,并且找不到任何定义我自己的 JpaRepositoryFactoryBean 类的方法。自定义存储库基类的依赖项似乎不会像标准 bean 中那样自动注入(inject)(请参阅 herehere )。此外,在创建存储库接口(interface)的实例时,默认的 JpaRepositoryFactory 仅将 JpaEntityInformationEntityManager 的实例传递给类构造函数(请参阅 here ) 。据我所知,这有效地阻止了您为扩展 SimpleJpaRepository 的类添加额外的依赖项。

我最终通过以下方式定义了自定义工厂:

@Configuration
@ConfigurationProperties(prefix = "spring.jpa.properties.hibernate.jdbc")
public class RepositoryConfiguration {
    private int batchSize;
}

public class MyCustomRepositoryFactoryBean<R extends JpaRepository<T, I>, T, I extends Serializable> extends JpaRepositoryFactoryBean<R, T, I> {

    private RepositoryConfiguration repositoryConfiguration;

    public MyCustomRepositoryFactoryBean(Class<? extends R> repositoryInterface, RepositoryConfiguration repositoryConfiguration) {
        super(repositoryInterface);
        this.repositoryConfiguration = repositoryConfiguration;
    }

    @Override
    protected RepositoryFactorySupport createRepositoryFactory(EntityManager entityManager) {
        return new MyCustomRepositoryFactory(entityManager, repositoryConfiguration);
    }

    private static class MyCustomRepositoryFactory<T, I extends Serializable> extends JpaRepositoryFactory {

        private RepositoryConfiguration repositoryConfiguration;

        MyCustomRepositoryFactory(EntityManager entityManager, RepositoryConfiguration repositoryConfiguration) {
            super(entityManager);
            this.repositoryConfiguration = repositoryConfiguration;
        }

        @Override
        @SuppressWarnings("unchecked")
        protected SimpleJpaRepository<?, ?> getTargetRepository(RepositoryInformation information, 
                EntityManager entityManager) {

            JpaEntityInformation<T, ?> entityInformation = 
                    (JpaEntityInformation<T, ?>) getEntityInformation(information.getDomainType());

            return new MyCustomRepositoryImpl<T, I>(
                    entityInformation, 
                    entityManager, 
                    repositoryConfiguration);
        }

        @Override
        protected Class<?> getRepositoryBaseClass(RepositoryMetadata metadata) {
            return MyCustomRepositoryImpl.class;
        }
    }
}

虽然也不可能在 MyCustomRepositoryFactoryBean 中使用 @Value 注入(inject)字段,但 Spring 会解析传递给构造函数的依赖项,因此您只需通过bean(上面代码中的RepositoryConfiguration)并将其传递给MyCustomRepositoryImpl。最后,您需要通过添加来指示 Spring Data 在创建存储库时使用您的 FactoryBean

@EnableJpaRepositories(
        repositoryFactoryBeanClass = MyCustomRepositoryFactoryBean.class
)

@Configuration 带注释的 bean。虽然有很多样板,但它确实有效。

注意我正在使用 spring-data-jpa:1.11.8.RELEASE。

关于java - 如何在自定义 Spring Data JPA 存储库中注入(inject)配置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45462613/

相关文章:

eclipse - Spring Tool Suite(STS版本3.6.1)没有创建Roo项目的选项

java - JSF Facelets 渲染问题

java - Spring国际化: locale change problem

java - Bitronix + Spring + Hibernate + 持久性

java - Spring Boot 应用程序中的 Rest API 无法在本地网络上访问

c# - 在 DDD 方法中,这个示例是否正确建模?

java - 在 IntelliJ Idea 中更新 Maven 依赖项

repository - 存储库中的 Aar。外部依赖和 NoClassDefFoundError

java - 几个 Java 泛型问题

java - ElasticSearch 解析异常