如何在Spring容器之外使用Spring Data JPA?

我正在尝试手动连接Spring Data JPA对象,以便可以生成DAO代理(也称为存储库)-而不使用Spring bean容器。

不可避免地,我会被问到为什么要这样做:这是因为我们的项目已经在使用Google Guice(以及在UI上使用Gin和GWT的UI),并且我们不想维护其他IoC容器配置,也不想插入所有产生的依赖关系。我知道我们也许可以使用Guice's SpringIntegration,但这将是最后的选择。

似乎所有可用的方法都可以手动将对象连接起来,但是由于没有充分记录,因此我很难过。

根据Spring Data用户指南,可以独立使用存储库工厂。不幸的是,该示例显示了RepositoryFactorySupport哪个是抽象类。经过一番搜索,我设法找到了JpaRepositoryFactory

JpaRepositoryFactory实际上工作得很好,只是它不会自动创建事务。必须手动管理事务,否则什么都不会持久化到数据库中:

entityManager.getTransaction().begin();

repositoryInstance.save(someJpaObject);

entityManager.getTransaction().commit();

原来的问题是@Transactional注解不会自动使用,需要一个TransactionInterceptor

值得庆幸的是,JpaRepositoryFactory在返回之前,可以进行回调以向生成的存储库代理添加更多AOP建议。

final JpaTransactionManager xactManager = new JpaTransactionManager(emf);

final JpaRepositoryFactory factory = new JpaRepositoryFactory(emf.createEntityManager());

factory.addRepositoryProxyPostProcessor(new RepositoryProxyPostProcessor() {

@Override

public void postProcess(ProxyFactory factory) {

factory.addAdvice(new TransactionInterceptor(xactManager, new AnnotationTransactionAttributeSource()));

}

});

这是事情进展不太顺利的地方。逐步调试代码中的调试器,TransactionInterceptor确实确实在创建事务-但是错误EntityManagerSpring EntityManager通过查看当前正在执行的线程来管理活动线程。这样TransactionInterceptor就可以看到EntityManager该线程没有活动的绑定,并决定创建一个新的线程。

但是,此新EntityManager实例与创建并传递到JpaRepositoryFactory构造函数的实例不同,后者需要一个EntityManager。现在的问题是,如何让我的TransactionInterceptorJpaRepositoryFactory使用相同的EntityManager

回答:

JpaRepositoryFactory和相应的Spring集成JpaRepositoryFactorybean 的设计背后的一般原则如下:

我们假设你在托管的 JPA运行时环境中运行应用程序,而不关心哪个。

这就是我们依赖注入EntityManager而不是依赖的原因EntityManagerFactory。根据定义,EntityManager这不是线程安全的。因此,如果EntityManagerFactory直接处理,我们将不得不重写所有资源管理代码,托管运行时环境(就像Spring或EJB一样)将为你提供。

为了与Spring事务管理集成,我们使用Spring的方法SharedEntityManagerCreator,它实际上完成了你手动实现的事务资源绑定魔术。因此,你可能想使用该EntityManager实例从中创建实例EntityManagerFactory。如果你想直接在存储库bean处激活事务性(以便repo.save(…)在没有活动的情况下调用例如创建事务),请查看TransactionalRepositoryProxyPostProcessorSpring Data Commons 中的实现。实际上,当直接使用Spring Data存储库时(例如repo.save(…)),它会激活事务,并略微定制事务配置查找,以使接口优先于实现类,以允许存储库接口覆盖定义的事务配置SimpleJpaRepository

以上是 如何在Spring容器之外使用Spring Data JPA? 的全部内容, 来源链接: utcz.com/qa/416919.html

回到顶部