我正在开发一个使用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
包装或如何更改其行为(我不想让它调用事务创建)?