大佬教程收集整理的这篇文章主要介绍了如何在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
确实确实在创建事务-但是错误Entitymanager
。Spring Entitymanager通
过查看当前正在执行的线程来管理活动线程。这样transactionInterceptor
就可以看到Entitymanager
该线程没有活动的绑定,并决定创建一个新的线程。
但是,此新Entitymanager
实例与创建并传递到JpaRepositoryFactory
构造函数的实例不同,后者需要一个Entitymanager
。现在的问题是,如何让我的transactionInterceptor
和JpaRepositoryFactory
使用相同的Entitymanager
?
以上是大佬教程为你收集整理的如何在Spring容器之外使用Spring Data JPA?全部内容,希望文章能够帮你解决如何在Spring容器之外使用Spring Data JPA?所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。