此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Data JPA 3.5.0

CDI 集成

存储库接口的实例通常由容器创建,在使用 Spring Data 时,Spring 是最自然的选择。Spring 为创建 bean 实例提供了复杂的支持,如创建存储库实例中所述。从版本 1.1.0 开始,Spring Data JPA 附带了一个自定义 CDI 扩展,允许在 CDI 环境中使用存储库抽象。该扩展是 JAR 的一部分。要激活它,请在 Classpath 中包含 Spring Data JPA JAR。

现在,您可以通过为EntityManagerFactoryEntityManager,如以下示例所示:

class EntityManagerFactoryProducer {

  @Produces
  @ApplicationScoped
  public EntityManagerFactory createEntityManagerFactory() {
    return Persistence.createEntityManagerFactory("my-persistence-unit");
  }

  public void close(@Disposes EntityManagerFactory entityManagerFactory) {
    entityManagerFactory.close();
  }

  @Produces
  @RequestScoped
  public EntityManager createEntityManager(EntityManagerFactory entityManagerFactory) {
    return entityManagerFactory.createEntityManager();
  }

  public void close(@Disposes EntityManager entityManager) {
    entityManager.close();
  }
}

必要的设置可能因 JavaEE 环境而异。您可能只需要重新声明EntityManager作为 CDI Bean 中,如下所示:

class CdiConfig {

  @Produces
  @RequestScoped
  @PersistenceContext
  public EntityManager entityManager;
}

在前面的示例中,容器必须能够创建 JPAEntityManagers本身。所有配置所做的只是重新导出 JPAEntityManager作为 CDI Bean 进行。

Spring Data JPA CDI 扩展拾取了所有可用的EntityManager实例作为 CDI Bean 创建,并在容器请求存储库类型的 Bean 时为 Spring Data 存储库创建代理。因此,获取 Spring Data 存储库的实例就是声明一个@Inject属性,如以下示例所示:

class RepositoryClient {

  @Inject
  PersonRepository repository;

  public void businessMethod() {
    List<Person> people = repository.findAll();
  }
}