JPA RollbackException persistent transaction provoque ultérieure des transactions valides à l'échec?
J'ai un @Transactional service de l'exécution d'une persister action dans une DB oracle. Si je lance un persister casser un unique violation-je obtenir attendus rollbackException:ConstraintException.
Le problème est que toute demande ultérieure (même si ne pas briser la contrainte d'unicité) de persister jette la même exception.
Il semble que JPA n'est pas de compensation de l'objet à persister de son gestionnaire de transactions? Je suis même près? J'ai besoin d'un peu d'explication.
Repo:
@Repository
public class UserRepository {
@PersistenceContext(type=PersistenceContextType.EXTENDED)
private EntityManager em;
public User findUserById(long id){
CriteriaBuilder builder = em.getCriteriaBuilder();
CriteriaQuery<User> query = builder.createQuery(User.class);
Root<User> root = query.from(User.class);
Predicate whereClause = builder.equal(root.get(User_.userId), id);
return em.createQuery(query.where(whereClause)).getSingleResult();
}
public User findUserByCredentials(String credentials){
CriteriaBuilder builder = em.getCriteriaBuilder();
CriteriaQuery<User> query = builder.createQuery(User.class);
Root<User> root = query.from(User.class);
Predicate whereClause = builder.equal(root.get(User_.credentials), credentials);
return em.createQuery(query.where(whereClause)).getSingleResult();
}
public void registerUser(User user){
em.persist(user);
}
}
ServiceImpl:
@Transactional(readOnly=true)
@Service("userService")
public class UserServiceImpl implements UserService {
@Resource
private UserRepository userRepository;
public void setUserRepository(UserRepository userRepository) {
this.userRepository = userRepository;
}
public User findUserById(long id) {
return userRepository.findUserById(id);
}
public User findUserByCredentials(String credentials){
return userRepository.findUserByCredentials(credentials);
}
@Transactional(readOnly=false)
public void registerUser(User user){
userRepository.registerUser(user);
}
}
erreur lancer dans le point de terminaison:
@PayloadRoot(localPart="RegisterUserRequest", namespace = "http://www.missingwire.com/schemas/User")
public RegisterUserResponseDocument registerUser(RegisterUserRequestDocument requestDoc){
RegisterUserRequest request = requestDoc.getRegisterUserRequest();
User user = new User();
user.setCredentials(request.getCredentials());
user.setPassword(request.getPassword());
user.setHonorRating(BigDecimal.valueOf(STARTING_USER_HONOR_RATING));
user.setAccountActive(true);
user.setDateCreated(new Date());
user.setVerified(false);
UserProfile userProfile = new UserProfile();
userProfile.setEmailAddress(request.getEmail());
userProfile.setFirstName(request.getFirstName());
userProfile.setLastName(request.getLastName());
userProfile.setDateCreated(new Date());
userProfile.setUser(user);
user.setUserProfile(userProfile);
**userService.registerUser(user);** //HERE IS THE EXCEPTION THROW
RegisterUserResponseDocument responseDoc = RegisterUserResponseDocument.Factory.newInstance();
RegisterUserResponse response = responseDoc.addNewRegisterUserResponse();
UserType userType = response.addNewUser();
userType.setAccountActive(user.getAccountActive());
userType.setCredentials(user.getCredentials());
userType.setDateCreated(DateConverter.convertDateToXML(user.getDateCreated()));
userType.setUserId(user.getUserId());
userType.setVerified(user.getVerified());
return responseDoc;
}
Exception:
org.springframework.orm.jpa.JpaSystemException: Erreur lors de la perpétration d'
la transaction; nested exception est
javax.la persistance.RollbackException: Erreur lors de la perpétration de l'
transaction à
org.springframework.orm.jpa.EntityManagerFactoryUtils.convertJpaAccessExceptionIfPossible(EntityManagerFactoryUtils.java:311)
au
org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:102)
au
org.springframework.orm.jpa.ExtendedEntityManagerCreator$ExtendedEntityManagerSynchronization.convertException(ExtendedEntityManagerCreator.java:501)
au
org.springframework.orm.jpa.ExtendedEntityManagerCreator$ExtendedEntityManagerSynchronization.afterCommit(ExtendedEntityManagerCreator.java:481)
au
org.springframework.transaction.support.TransactionSynchronizationUtils.invokeAfterCommit(TransactionSynchronizationUtils.java:133)
au
org.springframework.transaction.support.TransactionSynchronizationUtils.triggerAfterCommit(TransactionSynchronizationUtils.java:121)
au
org.springframework.transaction.support.AbstractPlatformTransactionManager.triggerAfterCommit(AbstractPlatformTransactionManager.java:953)
au
org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:796)
au
org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:723)
au
org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:393)
au
org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:120)
au
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
au
org.springframework.aop.cadre.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202)
à $Proxy37.registerUser(Unknown Source) at
com.missingwire.atteindre.soa.point de terminaison.UserEndpoint.registerUser(UserEndpoint.java:76)
au coucher du soleil.de réfléchir.NativeMethodAccessorImpl.invoke0(Native method) at
soleil.de réfléchir.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
au
soleil.de réfléchir.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
à java.lang.de réfléchir.La méthode.invoke(la Méthode.java:616) à
org.springframework.ws.serveur.point de terminaison.MethodEndpoint.invoke(MethodEndpoint.java:132)
au
org.springframework.ws.server.endpoint.adapter.MarshallingMethodEndpointAdapter.invokeInternal(MarshallingMethodEndpointAdapter.java:140)
au
org.springframework.ws.server.endpoint.adapter.AbstractMethodEndpointAdapter.invoke(AbstractMethodEndpointAdapter.java:53)
au
org.springframework.ws.serveur.MessageDispatcher.dispatch(MessageDispatcher.java:231)
au
org.springframework.ws.serveur.MessageDispatcher.recevoir(MessageDispatcher.java:172)
au
org.springframework.ws.transport.support.WebServiceMessageReceiverObjectSupport.handleConnection(WebServiceMessageReceiverObjectSupport.java:88)
au
org.springframework.ws.transport.http.WebServiceMessageReceiverHandleradapter.handle(WebServiceMessageReceiverHandleradapter.java:57)
au
org.springframework.ws.transport.http.MessageDispatcherServlet.doService(MessageDispatcherServlet.java:221)
au
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:669)
au
org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:585)
au javax.servlet.http.HttpServlet.service(HttpServlet.java:637) à
javax.servlet.http.HttpServlet.service(HttpServlet.java:717) à
org.apache.catalina.de base.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
au
org.apache.catalina.de base.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
au
org.apache.catalina.de base.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
au
org.apache.catalina.de base.StandardContextValve.invoke(StandardContextValve.java:191)
au
org.apache.catalina.de base.StandardHostValve.invoke(StandardHostValve.java:127)
au
org.apache.catalina.les vannes.ErrorReportValve.invoke(ErrorReportValve.java:102)
au
org.apache.catalina.de base.StandardEngineValve.invoke(StandardEngineValve.java:109)
au
org.apache.catalina.connecteur.CoyoteAdapter.service(CoyoteAdapter.java:293)
au
org.apache.coyote.http11.Http11Processor.processus(Http11Processor.java:859)
au
org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processus(Http11Protocol.java:602)
au
org.apache.tomcat.util.net.JIoEndpoint$Travailleur.exécuter(JIoEndpoint.java:489)
à java.lang.Fil de discussion.exécution(Thread.java:679) Causés par:
javax.la persistance.RollbackException: Erreur lors de la perpétration de l'
transaction à
org.mise en veille prolongée.ejb.TransactionImpl.commit(TransactionImpl.java:93) à
org.springframework.orm.jpa.ExtendedEntityManagerCreator$ExtendedEntityManagerSynchronization.afterCommit(ExtendedEntityManagerCreator.java:478)
... 39 plus Causée par: javax.la persistance.PersistenceException:
org.mise en veille prolongée.exception à la règle.ConstraintViolationException: ne Peut pas
exécuter JDBC mise à jour par lot à
org.mise en veille prolongée.ejb.AbstractEntityManagerImpl.convertir(AbstractEntityManagerImpl.java:1235)
au
org.mise en veille prolongée.ejb.AbstractEntityManagerImpl.convertir(AbstractEntityManagerImpl.java:1168)
au org.mise en veille prolongée.ejb.TransactionImpl.commit(TransactionImpl.java:81)
... Plus de 40 Causés par:
org.mise en veille prolongée.exception à la règle.ConstraintViolationException: ne Peut pas
exécuter JDBC mise à jour par lot à
org.mise en veille prolongée.exception à la règle.SQLStateConverter.convertir(SQLStateConverter.java:96)
au
org.mise en veille prolongée.exception à la règle.JDBCExceptionHelper.convertir(JDBCExceptionHelper.java:66)
au
org.mise en veille prolongée.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:275)
au
org.mise en veille prolongée.jdbc.AbstractBatcher.prepareStatement(AbstractBatcher.java:114)
au
org.mise en veille prolongée.jdbc.AbstractBatcher.prepareStatement(AbstractBatcher.java:109)
au
org.mise en veille prolongée.jdbc.AbstractBatcher.prepareBatchStatement(AbstractBatcher.java:244)
au
org.mise en veille prolongée.persister.de l'entité.AbstractEntityPersister.insert(AbstractEntityPersister.java:2395)
au
org.mise en veille prolongée.persister.de l'entité.AbstractEntityPersister.insert(AbstractEntityPersister.java:2858)
au
org.mise en veille prolongée.d'action.EntityInsertAction.execute(EntityInsertAction.java:79)
au org.mise en veille prolongée.moteur.ActionQueue.execute(ActionQueue.java:267) à
org.mise en veille prolongée.moteur.ActionQueue.executeActions(ActionQueue.java:259)
au
org.mise en veille prolongée.moteur.ActionQueue.executeActions(ActionQueue.java:178)
au
org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:321)
au
org.mise en veille prolongée.de l'événement.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:51)
au org.mise en veille prolongée.impl.SessionImpl.flush(SessionImpl.java:1206) à
org.mise en veille prolongée.impl.SessionImpl.managedFlush(SessionImpl.java:375) à
org.mise en veille prolongée.des transactions.JDBCTransaction.commit(JDBCTransaction.java:137)
au org.mise en veille prolongée.ejb.TransactionImpl.commit(TransactionImpl.java:76)
... Plus de 40 Causés par: java.sql.BatchUpdateException: ORA-00001:
la contrainte unique (ATTEINDRE.SYS_C0016488) a violéà
oracle.jdbc.le pilote.OraclePreparedStatement.executeBatch(OraclePreparedStatement.java:10070)
au
oracle.jdbc.le pilote.OracleStatementWrapper.executeBatch(OracleStatementWrapper.java:213)
au
org.mise en veille prolongée.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:70)
au
org.mise en veille prolongée.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:268)
- Qui n'a pas l'air bon. Jusqu'à quelle hauteur de la pile d'appel est à votre demande en cours de restauration avant de faire une autre demande (qui casse). Êtes-vous à l'aide gérée par le conteneur des transactions?
- les demandes sont envoyées à l'aide de savon et de printemps, mais je les fais à 30 secondes d'intervalle. Et je peux voir que l'exception dans le journal. Si vous avez besoin de moi pour le code postal laissez-moi savoir.
- Oui, veuillez ajouter le code à votre question.
- ok laissez-moi savoir si vous avez besoin de plus
- Posté code a l'air bien - quoi de la violation de la contrainte de tir hors de? Certainement pas l'ID. Veuillez ajouter la définition de l'entité pour l'Utilisateur, et à l'exception que vous obtenez.
- la contrainte est sur les pouvoirs de la colonne et c'est juste une contrainte d'unicité
- laissez-nous continuer cette discussion dans le chat
Vous devez vous connecter pour publier un commentaire.
Vous êtes l'injection de l'entité gestionnaire d'un contexte de persistance étendue. Cela signifie que la durée de vie du contexte de persistance n'est pas liée à la durée de vie de la transaction: elle reste ouverte jusqu'à ce que vous la fermer explicitement.
Depuis que vous êtes un RollbackException, le contexte de persistance est dans un sale état incohérent, et la seule chose que vous pouvez faire est de fermer immédiatement.
Si le contexte de persistance est une transactionnel, il serait fermé automatiquement. Mais puisque vous êtes en utilisant une extension de contexte, c'est à vous de le fermer explicitement.
Assurez-vous de lire et comprendre la section suivante du Ressort de la documentation:
Ajoutant:
Pour les méthodes que vous souhaitez exclure transactionallity (requêtes, par exemple), vous permettra d'éviter ce problème.