JpaRepository.getOne混乱

时间:2018-04-13 13:02:47

标签: java spring spring-data-jpa aop

我正在开发一个使用spring框架的大项目,我有这样的服务:

  @Component
  public class ExampleService{

       @Autowired
       ChildOfJpaRepository childOfJpaRepository;

       public void fetchAndSet(ExampleParentEntity exampleParentEntity,Long id){
          exampleParentEntity.setChildEntity(childOfJpaRepository.getOne(id));
       }
  }

ChildOfJpaRepository是一个存储库接口,它扩展了JpaRepository(来自org.springframework.data.jpa.repository包)。 ExampleParentEntity只是一个数据库实体,它有一个字段ExampleChildEntity和一个setter。当我致电childOfJpaRepository.getOne(id)时,我希望获得ExampleChildEntity的代理。但是,事实证明我的childOfJpaRepository包含在JdkDynamicAopProxy中。当方法getOne被执行时,它会调用TransactionInterceptor并在一段时间后创建一个事务。下面是执行getOne后发生的事件的完整堆栈跟踪(它不是错误堆栈跟踪,而只是触发getOne后发生的事情):

  

com.sun.proxy。$ Proxy1092.getOne()       org.springframework.aop.framework.JdkDynamicAopProxy.invoke()           org.springframework.aop.framework.ReflectiveMethodInvocation.proceed()
              org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor $ CrudMethodMetadataPopulatingMethodIntercceptor.invoke()                   org.springframework.aop.framework.ReflectiveMethodInvocation.proceed()
                      org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke()                           org.springframework.aop.framework.ReflectiveMethodInvocation.proceed()
                              org.springframework.transaction.interceptor.TransactionInterceptor.invoke()                                   org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction()                                       org.springframework.transaction.interceptor.TransactionAspectSupport.createTransactionIfNecessary()                                       org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning()
                                      org.springframework.transaction.interceptor.TransactionInterceptor $ 1.proceedWithInvocation()

我的问题是,因为事务正在创建,因此需要获取ExampleChildEntity的代理,我实际上得到ExampleChildEntity(我想要一个代理)。从我的分析来看,我似乎遇到面向方面编程配置的问题。如何关闭此JdkDynamicAopProxy包装或如何更改其行为(我不想让它调用事务创建)?

0 个答案:

没有答案