2017-04-22 1 views
2

je reçois cette exception de temps en temps dans l'environnement de production et n'ont pas été en mesure de le reproduire localement. D'autres ont eu ce problème, mais cela s'est produit lors de la mise à jour ou de la suppression.QueryDslJpaRepository.findAll La mise à jour par lots a renvoyé le nombre de lignes inattendu de la mise à jour [0]; nombre réel de lignes: 0; attendu: 1

J'ai une classe d'auditeur mis en correspondance avec la classe Tag qui, PrePersist(), fait en sorte qu'un utilisateur n'a pas enregistré plus de balises x.

La classe Tag est:

@Entity 
    @EntityListeners({ TagListener.class }) 
    public class Tag extends AbstractEntity { 

    ... 
    } 

La classe TagService enregistre des objets d'étiquette.

@Service 
public class TagService extends AbstractService<Tag> { 

public Tag saveTagForUser(AbstractEntity entity, User user) { 
... 
return save(tag);  

} 

Le TagListener écoute lorsque des objets d'étiquette sont enregistrés et supprime certains d'entre eux si cela est nécessaire.

@Component 
public class TagListener { 

    @Autowired 
    private TagService tagService; 

    /** 
    * Autowires this component's bean injections. 
    */ 
    private void autowire() { 
     if (tagService == null) { 
      ApplicationContextProvider.getApplicationContext().getAutowireCapableBeanFactory().autowireBean(this); 
     } 
    } 

    @PrePersist 
    public void prePersist(Tag tag) { 
     autowire(); 
     if (tagService.listUserTags(tag.getUser()).size() > Constants.Tags.maxPerUser) { 
      tagService.deleteAllUserTagsNotInTopN(tag.getUser(), Constants.Tag.maxPerUser); 
     } 
    } 
} 

Notez que l'exception est levée sur listUserTags et non sur deleteAllUserTagsNotInTopN

**javax.persistence.OptimisticLockException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1** 
    at **org.hibernate.jpa.spi.AbstractEntityManagerImpl.wrapStaleStateException(AbstractEntityManagerImpl.java:1800)** 
    at org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1705) 
    at org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1677) 
    at org.hibernate.jpa.internal.QueryImpl.getResultList(QueryImpl.java:458) 
    at **com.mysema.query.jpa.impl.AbstractJPAQuery.getResultList(AbstractJPAQuery.java:197)** 
    at com.mysema.query.jpa.impl.AbstractJPAQuery.list(AbstractJPAQuery.java:249) 
    at org.springframework.data.jpa.repository.support.QueryDslJpaRepository.findAll(QueryDslJpaRepository.java:101) 
    at sun.reflect.GeneratedMethodAccessor93.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:42) 
    at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.executeMethodOn(RepositoryFactorySupport.java:414) 
    at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.doInvoke(RepositoryFactorySupport.java:399) 
    at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.invoke(RepositoryFactorySupport.java:371) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
    at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:98) 
    at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:262) 
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:95) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
    at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:136) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
    at org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$CrudMethodMetadataPopulatingMethodIntercceptor.invoke(CrudMethodMetadataPostProcessor.java:122) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
    at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:207) 
    **at com.sun.proxy.$Proxy114.findAll(Unknown Source) 
    at ro.app.service.tag.TagService.listUserTags(TagService.java:823) 
    at ro.app.listener.TagListener.prePersist(TagListener.java:47)** 
    at sun.reflect.GeneratedMethodAccessor174.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:42) 
    at org.hibernate.jpa.event.internal.jpa.ListenerCallback.performCallback(ListenerCallback.java:49) 
    at org.hibernate.jpa.event.internal.jpa.CallbackRegistryImpl.callback(CallbackRegistryImpl.java:112) 
    at org.hibernate.jpa.event.internal.jpa.CallbackRegistryImpl.preCreate(CallbackRegistryImpl.java:57) 
    at org.hibernate.jpa.event.internal.core.JpaPersistEventListener.saveWithGeneratedId(JpaPersistEventListener.java:83) 
    at org.hibernate.event.internal.DefaultPersistEventListener.entityIsTransient(DefaultPersistEventListener.java:206) 
    at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:149) 
    at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:75) 
    at org.hibernate.internal.SessionImpl.firePersist(SessionImpl.java:811) 
    at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:784) 
    at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:789) 
    at org.hibernate.jpa.spi.AbstractEntityManagerImpl.persist(AbstractEntityManagerImpl.java:1181) 
    at sun.reflect.GeneratedMethodAccessor173.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:42) 
    at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:291) 
    at com.sun.proxy.$Proxy97.persist(Unknown Source) 
    at org.springframework.data.jpa.repository.support.SimpleJpaRepository.save(SimpleJpaRepository.java:431) 
    at sun.reflect.GeneratedMethodAccessor94.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:42) 
    at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.executeMethodOn(RepositoryFactorySupport.java:414) 
    at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.doInvoke(RepositoryFactorySupport.java:399) 
    at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.invoke(RepositoryFactorySupport.java:371) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
    at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:98) 
    at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:262) 
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:95) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
    at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:136) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
    at org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$CrudMethodMetadataPopulatingMethodIntercceptor.invoke(CrudMethodMetadataPostProcessor.java:122) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
    at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:207) 
    at com.sun.proxy.$Proxy114.save(Unknown Source) 
    at ro.app.service.AbstractService.save(AbstractService.java:530) 
    **at ro.app.service.TagService.saveTagForUser(TagService.java:351)** 

Enregistrement des objets tag est fait dans une transaction. Des indices sur ce que pourrait être le problème? Merci!

Répondre

0

Apparemment, le problème est à cause de la suppression des balises (fait dans la méthode deleteAllUserTagsNotInTopN()), même si elle n'a pas été visible dans le stacktrace. Dans le TagRepository, je l'ai remplacé la méthode supprimer avec méthode deleteInBatch:

public interface TagRepository extends JpaRepository<Tag,Long> { 

    void deleteInBatch(Iterable<Notification> notifications); 
}