Запрос с использованием Spring Data устанавливает только откат транзакции, но я не уверен, почему

Это мой интерфейс @Repository с собственным запросом:

@Repository
public interface RecentPersonRepository extends JpaRepository<RecentPerson, Long>{
@Query(value = "select id, person_id, unique_sc_id, unique_c_id, person_first_name, person_last_name, viewed_date, dob from recent_person where person_id = ?1  order by viewed_date desc", nativeQuery = true)
List<RecentPerson> getRecentPersons(String adjusterId);

}

Этот метод вызывается другим методом, имеющим аннотацию @Transactional. Вызов getRecentPersons() во внутренней работе Spring вызывает setRollbackOnly(true), что приводит к сбою остальной части транзакции. Вызов getRecentPersons() фактически завершается и возвращает правильные результаты, но когда транзакция фиксируется позже, метод не работает, потому что транзакция была настроена на откат во время метода запроса.

Spring вызывает setRollbackOnly где-то там, где он имеет дело с параметрами, но я передаю одно значение методу, и метод фактически завершается, даже если он был настроен на откат, вызывая только сбой остальной части метода.

Что-то не так с моим запросом? Или проблема в том, что это native=true или что-то в этом роде?

Ниже приведено исключение, которое вызывает откат и трассировку стека, вызывающую setRollbackOnly:

java.lang.IllegalArgumentException: No parameter with index : 1 was found within the query: ReadAllQuery(referenceClass=RecentPerson sql = "select id, person_id, unique_sc_id, unique_c_id, person_first_name, person_last_name, viewed_date, dob from recent_person where person_id = ?1  order by viewed_date desc").


setRollbackOnly:862, QueryImpl (org.eclipse.persistence.internal.jpa)
getParameter:966, QueryImpl (org.eclipse.persistence.internal.jpa)
getBindingFor:80, StringQueryParameterBinder (org.springframework.data.jpa.repository.query)
bind:60, StringQueryParameterBinder (org.springframework.data.jpa.repository.query)
bind:101, ParameterBinder (org.springframework.data.jpa.repository.query)
bind:76, SpelExpressionStringQueryParameterBinder (org.springframework.data.jpa.repository.query)
bindAndPrepare:161, ParameterBinder (org.springframework.data.jpa.repository.query)
bindAndPrepare:152, ParameterBinder (org.springframework.data.jpa.repository.query)
doCreateQuery:81, AbstractStringBasedJpaQuery (org.springframework.data.jpa.repository.query)
createQuery:190, AbstractJpaQuery (org.springframework.data.jpa.repository.query)
doExecute:123, JpaQueryExecution$CollectionExecution (org.springframework.data.jpa.repository.query)
execute:87, JpaQueryExecution (org.springframework.data.jpa.repository.query)
doExecute:116, AbstractJpaQuery (org.springframework.data.jpa.repository.query)
execute:106, AbstractJpaQuery (org.springframework.data.jpa.repository.query)
doInvoke:492, RepositoryFactorySupport$QueryExecutorMethodInterceptor (org.springframework.data.repository.core.support)
invoke:475, RepositoryFactorySupport$QueryExecutorMethodInterceptor (org.springframework.data.repository.core.support)
proceed:179, ReflectiveMethodInvocation (org.springframework.aop.framework)
invoke:56, DefaultMethodInvokingMethodInterceptor (org.springframework.data.projection)
proceed:179, ReflectiveMethodInvocation (org.springframework.aop.framework)
proceedWithInvocation:99, TransactionInterceptor$1 (org.springframework.transaction.interceptor)
invokeWithinTransaction:282, TransactionAspectSupport (org.springframework.transaction.interceptor)
invoke:96, TransactionInterceptor (org.springframework.transaction.interceptor)
proceed:179, ReflectiveMethodInvocation (org.springframework.aop.framework)
invoke:136, PersistenceExceptionTranslationInterceptor (org.springframework.dao.support)
proceed:179, ReflectiveMethodInvocation (org.springframework.aop.framework)
invoke:133, CrudMethodMetadataPostProcessor$CrudMethodMetadataPopulatingMethodInterceptor (org.springframework.data.jpa.repository.support)
proceed:179, ReflectiveMethodInvocation (org.springframework.aop.framework)
invoke:92, ExposeInvocationInterceptor (org.springframework.aop.interceptor)
proceed:179, ReflectiveMethodInvocation (org.springframework.aop.framework)
invoke:57, SurroundingTransactionDetectorMethodInterceptor (org.springframework.data.repository.core.support)
proceed:179, ReflectiveMethodInvocation (org.springframework.aop.framework)
invoke:213, JdkDynamicAopProxy (org.springframework.aop.framework)
getRecentPersons:-1, $Proxy193 (com.sun.proxy)
addRecentPerson:235, PersonService (com.blah.portal.services.web.service)
invoke:-1, PersonService$$FastClassBySpringCGLIB$$50ca8ee8 (com.blah.portal.services.web.service)
invoke:204, MethodProxy (org.springframework.cglib.proxy)
invokeJoinpoint:738, CglibAopProxy$CglibMethodInvocation (org.springframework.aop.framework)
proceed:157, ReflectiveMethodInvocation (org.springframework.aop.framework)
proceedWithInvocation:99, TransactionInterceptor$1 (org.springframework.transaction.interceptor)
invokeWithinTransaction:282, TransactionAspectSupport (org.springframework.transaction.interceptor)
invoke:96, TransactionInterceptor (org.springframework.transaction.interceptor)
proceed:179, ReflectiveMethodInvocation (org.springframework.aop.framework)
intercept:673, CglibAopProxy$DynamicAdvisedInterceptor (org.springframework.aop.framework)
addRecentPerson:-1, PersonService$$EnhancerBySpringCGLIB$$372034be (com.blah.portal.services.web.service)
addRecentPerson:49, PersonController (com.blah.portal.services.web.controller)

Версии

org.springframework.data:spring-data-commons:1.13.10.RELEASE
org.springframework.data:spring-data-jpa:1.11.10.RELEASE

org.eclipse.persistence:eclipselink:2.7.1
org.eclipse.persistence:javax.persistence:2.1.1
org.eclipse.persistence:org.eclipse.persistence.jpa:2.4.2
org.eclipse.persistence:org.eclipse.persistence.jpa.jpql:2.4.2

Почему у вас Eclipselink: 2.7.1 с org.eclipse.persistence.jpa: 2.4.2? Вы используете классы реализации 2.4.1 EclipseLink JPA вместо основных классов 2.7.1. Просто используйте 2.7.1, и вы не увидите, как QueryImpl вызывает setRollbackOnly.

Chris 21.06.2018 17:41

Мне показалось странным иметь откровенную путаницу версий библиотек, но я не был уверен, что это могло вызвать эту проблему. Я добавил явную зависимость к классам 2.7.1 jpa, и проблема была решена. Спасибо!!

user1531567 22.06.2018 01:22
1
2
53
0

Другие вопросы по теме