程序问答   发布时间:2022-06-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了如何在Spring容器之外使用Spring Data JPA?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

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

开发过程中遇到如何在Spring容器之外使用Spring Data JPA?的问题如何解决?下面主要结合日常开发的经验,给出你关于如何在Spring容器之外使用Spring Data JPA?的解决方法建议,希望对你解决如何在Spring容器之外使用Spring Data JPA?有所启发或帮助;

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 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

大佬总结

以上是大佬教程为你收集整理的如何在Spring容器之外使用Spring Data JPA?全部内容,希望文章能够帮你解决如何在Spring容器之外使用Spring Data JPA?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。