, пожалуйста, помогите мне в 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: