对于最新的稳定版本,请使用 Spring Data JPA 3.3.1Spring中文文档

对于最新的稳定版本,请使用 Spring Data JPA 3.3.1Spring中文文档

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

现在,您可以通过为 和 实现 CDI 生产者来设置基础架构,如以下示例所示:EntityManagerFactoryEntityManagerSpring中文文档

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 环境而异。您可能只需要将 a 重新声明为 CDI bean,如下所示:EntityManagerSpring中文文档

class CdiConfig {

  @Produces
  @RequestScoped
  @PersistenceContext
  public EntityManager entityManager;
}

在前面的示例中,容器必须能够创建 JPA 本身。所有配置所做的就是将 JPA 重新导出为 CDI Bean。EntityManagersEntityManagerSpring中文文档

Spring Data JPA CDI 扩展将所有可用实例选取为 CDI bean,并在容器请求存储库类型的 Bean 时为 Spring Data 存储库创建代理。因此,获取 Spring Data 存储库的实例只需声明一个属性,如以下示例所示:EntityManager@InjectSpring中文文档

class RepositoryClient {

  @Inject
  PersonRepository repository;

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