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

InformationsquelleAutor Matt | 2012-11-30