SpringData JPA Управление транзакциями - PullRequest
0 голосов
/ 18 мая 2019

, пожалуйста, помогите мне в Spring JPA Transaction Management У меня есть два метода: usersService.addUser и membersService.addNew

@Service
@Transactional(propagation = PROPAGATION.SUPPORTS, readOnly=true)
public class UsersService {

@Autowired
UsersRepository usersRepository;

@Autowired
AuthotitiesRepository authoritiesReposotory;

@Transaction
public addUser(...){
   usersRespository.addUser...
   authoritiesRepository.addNew...
}
...

public interface UsersRepository extends JpaRepository<Users, String> {
   @Transactional
   @Modifying
   @Query(value = "insert into users..."
}

public interface AuthoritiesRepository extends JpaRepository<Users, String> {
   @Transactional
   @Modifying
   @Query(value = "insert into abc ...."
}

Проблема заключается в том, что authorityRepository.addNew выдает исключение (по некоторому синтаксису SQL), и я хочу автоматически откатить информацию о пользователе.

Как настроить в хранилище сервис?

Вот трассировка исключения:

2019-05-22 08: 33: 16.185 WARN 2276 --- [nio-8080-exec-4] o.h.engine.jdbc.spi.SqlExceptionHelper: Ошибка SQL: 42102, SQLState: 42S02 2019-05-22 08: 33: 16.185 ОШИБКА 2276 --- [nio-8080-exec-4] o.h.engine.jdbc.spi.SqlExceptionHelper: таблица "AUTHORITIESS" не найдена; Оператор SQL: вставить в полномочия (имя пользователя, полномочия) значения (?,?) [42102-199] 2019-05-22 08: 33: 16.220 ОШИБКА 2276 --- [nio-8080-exec-4] o.s.t.i.TransactionInterceptor: исключение приложения, переопределенное исключением из коммита

com.springboot.example.exception.DbCRUDException: ошибка при добавлении пользователя в com.springboot.example.security.service.UsersService.addUser (UsersService.java:141) ~ [classes /: na] в com.springboot.example.security.service.UsersService $$ FastClassBySpringCGLIB $$ 3d37fb4e.invoke () ~ [classes /: na] в org.springframework.cglib.proxy.MethodProxy.invoke (MethodProxy.java:218) [spring-core-5.1.6.RELEASE.jar: 5.1.6.RELEASE] в org.springframework.aop.framework.CglibAopProxy $ CglibMethodInvocation.invokeJoinpoint (CglibAopProxy.java:749) [spring-aop-5.1.6.RELEASE.jar: 5.1.6.RELEASE] в org.springframework.aop.framework.ReflectiveMethodInvocation.proceed (ReflectiveMethodInvocation.java:163) [spring-aop-5.1.6.RELEASE.jar: 5.1.6.RELEASE] в org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke (PersistenceExceptionTranslationInterceptor.java:139) ~ [spring-tx-5.1.6.RELEASE.jar: 5.1.6.RELEASE] в org.apache.tomcat.util.net.SocketProcessorBase.run (SocketProcessorBase.java:49) [tomcat-embed-core-9.0.17.jar: 9.0.17] в java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1149) [na: 1.8.0_162] в java.util.concurrent.ThreadPoolExecutor $ Worker.run (ThreadPoolExecutor.java:624) [na: 1.8.0_162] в org.apache.tomcat.util.threads.TaskThread $ WrappingRunnable.run (TaskThread.java:61) [tomcat-embed-core-9.0.17.jar: 9.0.17] at java.lang.Thread.run (Thread.java:748) [na: 1.8.0_162] Вызвано: com.springboot.example.exception.DbCRUDException: Ошибка при добавлении прав на com.springboot.example.security.service.AuthoritiesService.addNew (AuthoritiesService.java:58) ~ [classes /: na] на com.springboot.example.security.service.UsersService.addUser (UsersService.java:139) ~ [classes /: na] ... 114 общих кадров опущено Вызвано: org.springframework.dao.InvalidDataAccessResourceUsageException: не удалось подготовить оператор; SQL [вставить в полномочия (имя пользователя, полномочия) значения (?,?)]; Вложенное исключение - org.hibernate.exception.SQLGrammarException: не удалось подготовить оператор в org.springframework.orm.jpa.vendor.HibernateJpaDialect.convertHibernateAccessException (HibernateJpaDialect.java:279) ~ [spring-orm-5.1.6.RELEASE.jar: 5.1.6.RELEASE] в org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible (HibernateJpaDialect.java:253) ~ [spring-orm-5.1.6.RELEASE.jar: 5.1.6.RELEASE] в org.springframework.data.jpa.repository.query.JpaQueryExecution $ ModifyingExecution.doExecute (JpaQueryExecution.java:256) ~ [spring-data-jpa-2.1.6.RELEASE.jar: 2.1.6.RELEASE] в org.springframework.data.jpa.repository.query.JpaQueryExecution.execute (JpaQueryExecution.java:91) ~ [spring-data-jpa-2.1.6.RELEASE.jar: 2.1.6.RELEASE] at org.springframework.data.jpa.repository.query.AbstractJpaQuery.doExecute (AbstractJpaQuery.java:136) ~ [spring-data-jpa-2.1.6.RELEASE.jar: 2.1.6.RELEASE] at org.springframework.data.jpa.repository.query.AbstractJpaQuery.execute (AbstractJpaQuery.java:125) ~ [spring-data-jpa-2.1.6.RELEASE.jar: 2.1.6.RELEASE]at org.springframework.data.repository.core.support.RepositoryFactorySupport $ QueryExecutorMethodInterceptor.doInvoke (RepositoryFactorySupport.java:605) ~ [spring-data-commons-2.1.6.RELEASE.jar: 2.1.6.R в org.springframework.data.repository.core.support.RepositoryFactorySupport $ QueryExecutorMethodInterceptor.lambda $ invoke $ 3 (RepositoryFactorySupport.java:595) ~ [sprin в org.springframework.transaction.interceptor.TransactionInterceptor.invoke (TransactionInterceptor.java:98) [spring-tx-5.1.6.RELEASE.jar: 5.1.6.RELEASE] в org.springframework.aop.framework.ReflectiveMethodInvocation.proceed (ReflectiveMethodInvocation.java:186) [spring-aop-5.1.6.RELEASE.jar: 5.1.6.RELEASE] в org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke (PersistenceExceptionTranslationInterceptor.java:139) ~ [spring-tx-5.1.6.RELEASE.jar: 5.1.6.RELEASE] ... 134 общих кадра опущено Вызвано: org.h2.jdbc.JdbcSQLSyntaxErrorException: таблица "AUTHORITIESS" не найдена; Оператор SQL: вставить в полномочия (имя пользователя, полномочия) значения (?,?) [42102-199] в org.h2.message.DbException.getJdbcSQLException (DbException.java:451) ~ [h2-1.4.199.jar: 1.4.199] в org.h2.message.DbException.getJdbcSQLException (DbException.java:427) ~ [h2-1.4.199.jar: 1.4.199] в org.h2.message.DbException.get (DbException.java:205) ~ [h2-1.4.199.jar: 1.4.199] 2019-05-22 08: 33: 16.226 ОШИБКА 2276 --- [nio-8080-exec-4] oaccC [. [. [/]. [DispatcherServlet]: Servlet.service () для сервлета [dispatcherServlet] в контексте с path [] сгенерировал исключение [Ошибка обработки запроса; вложенное исключение: org.springframework.transaction.UnexpectedRollbackException: транзакция автоматически откатывается, потому что она была помечена как только для отката] с основной причиной

org.springframework.transaction.UnexpectedRollbackException: транзакция автоматически откатывается, поскольку она помечена как только для отката в org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit (AbstractPlatformTransactionManager.java:755) ~ [spring-tx-5.1.6.RELEASE.jar:

1 Ответ

0 голосов
/ 18 мая 2019

Как уже упоминалось @thanhngo.Вот как это сделать.

У вас уже есть правильная аннотация для метода addUser, и любая RuntimeException приведет к откату транзакции.

Убедитесь, что usersRespository.addUser... и authoritiesReposotory.addNew... также имеют@Transactional аннотация

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...