web-dev-qa-db-fra.com

org.hibernate.StaleStateException: la mise à jour par lot a renvoyé un nombre de lignes inattendu à partir de update [0]; nombre actuel de lignes: 0; attendu

Je reçois cette erreur lorsque j'essaie de mettre à jour les valeurs de ma base de données à partir de mon application spring mvc: 

 org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1
        at org.hibernate.jdbc.Expectations$BasicExpectation.checkBatched(Expectations.Java:61)
        at org.hibernate.jdbc.Expectations$BasicExpectation.verifyOutcome(Expectations.Java:46)
        at org.hibernate.jdbc.BatchingBatcher.checkRowCounts(BatchingBatcher.Java:68)
        at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.Java:48)
        at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.Java:242)
        at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.Java:235)
        at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.Java:140)
        at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.Java:298)
        at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.Java:27)
        at org.hibernate.impl.SessionImpl.flush(SessionImpl.Java:1000)
        at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.Java:338)
        at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.Java:106)
        at org.springframework.orm.hibernate3.HibernateTransactionManager.doCommit(HibernateTransactionManager.Java:656)
        at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.Java:754)
        at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.Java:723)
        at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.Java:393)
        at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.Java:120)
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.Java:172)
        at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.Java:202)
        at com.Sun.proxy.$Proxy21.updatePerson(Unknown Source)
        at se.lowdin.civilforsvaret.webapp.controller.EditPersonContoller.save(EditPersonContoller.Java:57)
        at Sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at Sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.Java:57)
        at Sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.Java:43)
        at Java.lang.reflect.Method.invoke(Method.Java:601)
        at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.Java:176)
        at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.Java:426)
        at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.Java:414)
        at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.Java:790)
        at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.Java:719)
        at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.Java:644)
        at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.Java:560)
        at javax.servlet.http.HttpServlet.service(HttpServlet.Java:641)
        at javax.servlet.http.HttpServlet.service(HttpServlet.Java:722)
        at org.Apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.Java:304)
        at org.Apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.Java:210)
        at org.Apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.Java:240)
        at org.Apache.catalina.core.StandardContextValve.invoke(StandardContextValve.Java:164)
        at org.Apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.Java:462)
        at org.Apache.catalina.core.StandardHostValve.invoke(StandardHostValve.Java:164)
        at org.Apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.Java:100)
        at org.Apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.Java:562)
        at org.Apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.Java:118)
        at org.Apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.Java:395)
        at org.Apache.coyote.http11.Http11Processor.process(Http11Processor.Java:250)
        at org.Apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.Java:188)
        at org.Apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.Java:166)
        at org.Apache.Tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.Java:302)
        at Java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.Java:1145)
        at Java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.Java:615)
        at Java.lang.Thread.run(Thread.Java:722)
    DEBUG: org.hibernate.jdbc.AbstractBatcher - about to close PreparedStatement (open PreparedStatements: 1, globally: 1)
    TRACE: org.hibernate.jdbc.AbstractBatcher - closing statement
    ERROR: org.hibernate.event.def.AbstractFlushingEventListener - Could not synchronize database state with session
    org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1
        at org.hibernate.jdbc.Expectations$BasicExpectation.checkBatched(Expectations.Java:61)
        at org.hibernate.jdbc.Expectations$BasicExpectation.verifyOutcome(Expectations.Java:46)
        at org.hibernate.jdbc.BatchingBatcher.checkRowCounts(BatchingBatcher.Java:68)
        at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.Java:48)
        at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.Java:242)
        at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.Java:235)
        at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.Java:140)
        at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.Java:298)
        at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.Java:27)
        at org.hibernate.impl.SessionImpl.flush(SessionImpl.Java:1000)
        at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.Java:338)
        at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.Java:106)
        at org.springframework.orm.hibernate3.HibernateTransactionManager.doCommit(HibernateTransactionManager.Java:656)
        at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.Java:754)
        at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.Java:723)
        at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.Java:393)
        at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.Java:120)
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.Java:172)
        at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.Java:202)
        at com.Sun.proxy.$Proxy21.updatePerson(Unknown Source)
        at se.lowdin.civilforsvaret.webapp.controller.EditPersonContoller.save(EditPersonContoller.Java:57)
        at Sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at Sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.Java:57)
        at Sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.Java:43)
        at Java.lang.reflect.Method.invoke(Method.Java:601)
        at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.Java:176)
        at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.Java:426)
        at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.Java:414)
        at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.Java:790)
        at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.Java:719)
        at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.Java:644)
        at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.Java:560)
        at javax.servlet.http.HttpServlet.service(HttpServlet.Java:641)
        at javax.servlet.http.HttpServlet.service(HttpServlet.Java:722)
        at org.Apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.Java:304)
        at org.Apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.Java:210)
        at org.Apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.Java:240)
        at org.Apache.catalina.core.StandardContextValve.invoke(StandardContextValve.Java:164)
        at org.Apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.Java:462)
        at org.Apache.catalina.core.StandardHostValve.invoke(StandardHostValve.Java:164)
        at org.Apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.Java:100)
        at org.Apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.Java:562)
        at org.Apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.Java:118)
        at org.Apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.Java:395)
        at org.Apache.coyote.http11.Http11Processor.process(Http11Processor.Java:250)
        at org.Apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.Java:188)
        at org.Apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.Java:166)
        at org.Apache.Tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.Java:302)
        at Java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.Java:1145)
        at Java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.Java:615)
        at Java.lang.Thread.run(Thread.Java:722)
    TRACE: org.hibernate.jdbc.ConnectionManager - registering flush end
    DEBUG: org.hibernate.transaction.JDBCTransaction - rollback
    DEBUG: org.hibernate.transaction.JDBCTransaction - re-enabling autocommit
    DEBUG: org.hibernate.transaction.JDBCTransaction - rolled back JDBC Connection
    TRACE: org.hibernate.jdbc.JDBCContext - after transaction completion
    DEBUG: org.hibernate.jdbc.ConnectionManager - transaction completed on session with on_close connection release mode; be sure to close the session to release JDBC resources!
    TRACE: org.hibernate.impl.SessionImpl - after transaction completion
    TRACE: org.hibernate.impl.SessionImpl - closing session
    TRACE: org.hibernate.jdbc.ConnectionManager - performing cleanup
    DEBUG: org.hibernate.jdbc.ConnectionManager - releasing JDBC connection [ (open PreparedStatements: 0, globally: 0) (open ResultSets: 0, globally: 0)]
    TRACE: org.hibernate.jdbc.JDBCContext - after transaction completion
    DEBUG: org.hibernate.jdbc.ConnectionManager - transaction completed on session with on_close connection release mode; be sure to close the session to release JDBC resources!
    TRACE: org.hibernate.impl.SessionImpl - after transaction completion
    feb 07, 2014 11:04:32 FM org.Apache.catalina.core.StandardWrapperValve invoke
    SEVERE: Servlet.service() for servlet [spring] in context with path [/CRUDWebAppMavenized] threw exception [Request processing failed; nested exception is org.springframework.orm.hibernate3.HibernateOptimisticLockingFailureException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1; nested exception is org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1] with root cause
    org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1
        at org.hibernate.jdbc.Expectations$BasicExpectation.checkBatched(Expectations.Java:61)
        at org.hibernate.jdbc.Expectations$BasicExpectation.verifyOutcome(Expectations.Java:46)
        at org.hibernate.jdbc.BatchingBatcher.checkRowCounts(BatchingBatcher.Java:68)
        at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.Java:48)
        at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.Java:242)
        at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.Java:235)
        at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.Java:140)
        at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.Java:298)
        at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.Java:27)
        at org.hibernate.impl.SessionImpl.flush(SessionImpl.Java:1000)
        at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.Java:338)
        at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.Java:106)
        at org.springframework.orm.hibernate3.HibernateTransactionManager.doCommit(HibernateTransactionManager.Java:656)
        at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.Java:754)
        at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.Java:723)
        at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.Java:393)
        at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.Java:120)
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.Java:172)
        at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.Java:202)
        at com.Sun.proxy.$Proxy21.updatePerson(Unknown Source)
        at se.lowdin.civilforsvaret.webapp.controller.EditPersonContoller.save(EditPersonContoller.Java:57)
        at Sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at Sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.Java:57)
        at Sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.Java:43)
        at Java.lang.reflect.Method.invoke(Method.Java:601)
        at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.Java:176)
        at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.Java:426)
        at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.Java:414)
        at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.Java:790)
        at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.Java:719)
        at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.Java:644)
        at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.Java:560)
        at javax.servlet.http.HttpServlet.service(HttpServlet.Java:641)
        at javax.servlet.http.HttpServlet.service(HttpServlet.Java:722)
        at org.Apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.Java:304)
        at org.Apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.Java:210)
        at org.Apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.Java:240)
        at org.Apache.catalina.core.StandardContextValve.invoke(StandardContextValve.Java:164)
        at org.Apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.Java:462)
        at org.Apache.catalina.core.StandardHostValve.invoke(StandardHostValve.Java:164)
        at org.Apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.Java:100)
        at org.Apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.Java:562)
        at org.Apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.Java:118)
        at org.Apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.Java:395)
        at org.Apache.coyote.http11.Http11Processor.process(Http11Processor.Java:250)
        at org.Apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.Java:188)
        at org.Apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.Java:166)
        at org.Apache.Tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.Java:302)
        at Java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.Java:1145)
        at Java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.Java:615)
        at Java.lang.Thread.run(Thread.Java:722)

Donc, mon erreur réelle semble être quelque chose avec l'ID de la base de données et ce qui est mis à jour . Dans ma méthode GET, j'obtiens l'ID actuel, qui dans ce cas est 10.

@Autowired
PersonService service;


@RequestMapping(method = RequestMethod.GET)
public ModelAndView index(@PathVariable int id) {

    EditPersonBean bean = new EditPersonBean();

    if (id > 0) {
        Person person = service.getPerson(id);
        bean.copyValuesToBean(person);
    }

    ModelAndView mav = new ModelAndView("editPerson");
    mav.addObject("editPersonBean", bean);
    return mav;

}

Mais dans ma méthode de publication, cet identifiant qui était 10 est tout à coup 0, ce qui, je pense, pourrait être la cause de cette erreur?

@RequestMapping(value = "/edit", method = RequestMethod.POST)
        public String save (EditPersonBean bean, Person person, @RequestParam(value = "file", required = false) MultipartFile file) {


            System.out.println("incoming id : " + bean.getId());

            try {

                Blob blob = Hibernate.createBlob(file.getInputStream());
                bean.copyBeanValuesToPerson(person,blob);
                service.updatePerson(person);

            } catch (IOException e) {
                e.printStackTrace();
            }


            return "redirect:/person.html";
        }

Quelle pourrait alors en être la cause ou est-ce que l'erreur est autre chose?

public class EditPersonBean {

        private int id;
        private String firstName;
        private String lastName;
        private String email;
        private String phoneNumber;
        private String otherInfo;
        private Blob image;
        private String userName;
        private String password;

        public void copyValuesToBean(Person person){

            setId((int) person.getId());
            setFirstName(person.getFirstName());
            setLastName(person.getLastName());
            setEmail(person.getEmail());
            setPhoneNumber(person.getPhoneNumber());
            setOtherInfo(person.getOtherInfo());
            setImage(person.getImage());
            setUserName(person.getUserName());
            setPassword(person.getPassword());;

        }

@Entity
public class Person {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "ID")
    private int id;
    @Column(name = "FIRSTNAME")
    private String firstName;
    @Column(name = "SECONDNAME")
    private String lastName;
    @Column(name = "EMAIL")
    private String email;
    @Column(name = "MobilePHONENUM")
    private String phoneNumber;
    @Column(name = "OTHER")
    private String otherInfo;
    @Column(name = "image")
    @Lob
    private Blob image;
    @NotEmpty
    @Size(min = 1, max = 50)
    @Column(name = "username")
    private String userName;
    @NotEmpty
    @Size(min = 1, max = 20)
    @Column(name = "password")
    private String password;

    public Person() {

    }

    public Person(int id, String firstName, String lastName, String email,
            String phoneNumber, String otherInfo, Blob image, String userName, String password) {

        setId(id);
        setFirstName(firstName);
        setLastName(lastName);
        setEmail(email);
        setPhoneNumber(phoneNumber);
        setOtherInfo(otherInfo);
        setImage(image);
        setUserName(password);
        setPassword(userName);

    } //Getters and setters...

Classe JPA: 

@Override
    public Person getPerson(int personId) {
        return (Person)session.getCurrentSession().get(Person.class, personId);
    }
12
Sembrano

Cette erreur est généralement due au fait que l'hibernation ne trouve pas toutes les lignes nécessaires à la mise à jour . Cela signifie que lorsque vous essayez de mettre à jour des objets extraits de la base de données, ils n'existent plus (ou n'ont jamais existé dans le fichier). première place).

C'est peut-être parce qu'un autre thread les supprime ou que le mode d'isolation de la base de données est défini sur read_uncommited. Les lignes créées par une autre transaction n'ont donc pas pu être enregistrées (en raison d'un échec de la transaction) et n'existent plus.

14
David Fischer

La seule façon de exactement savoir ce qui se passe est d'activer la journalisation des instructions Hibernate dans votre configuration Hibernate.cfg.xml. En effet, aucun des numéros de ligne de la trace de pile ne correspond à la partie de votre code qui a effectué l'opération Hibernate proprement dite. Au lieu de cela, les opérations sont mises en lots, puis exécutées toutes en même temps à la clôture de la transaction (ou après qu'un nombre spécifié d'opérations ont été mises en lots). 

Pour activer la journalisation des instructions Hibernate,

    <property name="show_sql">true</property>
    <property name="format_sql">true</property>
    <property name="use_sql_comments">true</property>

Cela dit, la dernière fois que j'ai rencontré ce problème, il s'agissait d'un enregistrement en cours de suppression par la mise à jour HQL générale dans un autre thread/transaction, puis du thread/de la transaction en cours essayant de supprimer le même enregistrement par ID. Malheureusement, la transaction étant mise en lot, vous ne la voyez pas au moment où vous avez supprimé, mais plutôt à un moment donné plus tard au cours de l'exécution du programme. Par conséquent, il est nécessaire d'activer la consignation des instructions pour savoir quelle opération Hibernate a réellement déclenché l'exception.

10
eric.green
  • J'ai eu cette erreur parce que je voulais mettre à jour les données et j'ai utilisé

    service.update (utilisateur);

  • Mais à des fins de test, j’ai effacé La table User et oublié de changer la méthode pour 

    service.saveOrUpdate (utilisateur);

  • Ainsi, je l'ai changé et le problème a été résolu.

2
Gadhia Reema

J'ai rencontré un problème similaire, j'essayais de sauvegarder un objet dont l'identifiant était un champ primitif (long), et au moment de créer l'objet, l'identifiant était défini par défaut sur 0 et Hibernate supposait que je voulais mettre à jour. la ligne avec id = 0 (ce qui n'existe évidemment pas).

Ma solution a été de changer le champ id en Long (wrapper). Ainsi, lorsque je crée une nouvelle instance, l'id est défini sur null et Hibernate comprend que j'insère un nouvel élément dans la base de données.
J'espère que ça aide. Merci.

1

Vérifiez si la variable de l'objet mappée sur l'hibernation en tant qu'id (qui utilise une classe de générateur) ne contient aucune valeur périmée à la première place.

Si l'enregistrement a été supprimé par un autre thread ou une autre opération, mais que votre variable Id contient toujours la valeur périmée et que vous souhaitez mettre à jour l'enregistrement dans la base de données, cette exception vous est fournie car il n'y aura pas d'enregistrement pour l'identifiant donné dans la base de données et vous devrez donc sauvegarder l’objet au lieu de le mettre à jour, car il n’existe aucune possibilité de mettre à jour l’enregistrement.

Ou sinon

Définissez l'ID sur null lorsque vous utilisez la méthode saveOrUpdate.

1
Bhuvanesh s

J'ai eu le même problème et quand j'ai ajouté cascade='save-update', ça a résolu mes problèmes.

Ceci est mon correctif travaillé avec l'application CF.

1
Manjeet Mahto

Tapez simplement save au lieu de saveOrUpdate dans votre requête de veille prolongée. Cela est dû aux journaux précédents, votre classe génère un autre ID qui était précédemment stocké dans votre table. Hibernate essaie donc de mettre à jour avec le même ID et ne trouve aucune ligne avec cet ID, ce qui donne une valeur staleStateException.

1
user3785877

certaines fois, nous utilisons la classe generator pour générer la clé primaire d'une ligne ... mais nous l'ajoutons de force au programme au moment où nous aurons stalestateException.

student=new Student();
       student.setId(4);
       student.setName("thatha");
       student.setDept("dev");

           try {
               transaction = session.beginTransaction();

               session.save(student);
               transaction.commit();
               System.out.println("student is updated");

           } catch (HibernateException e) {
               e.printStackTrace();
               transaction.rollback();
               System.out.println("tx is rollback");
           }
1

100% Solution: 1 assurez-vous que id dans la table est incrémentation automatique Toutes vos clés étrangères ne sont pas nulles La portée est session 

1
Martin

Spécifiez ci-dessous l'attribut d'annotation dans la classe d'entité parent: -

import javax.persistence.CascadeType           
import javax.persistence.FetchType

@OneToMany(targetEntity = PhoneNumber.class, cascade = CascadeType.ALL, fetch = FetchType.LAZY, orphanRemoval = true)
0
Amit Mishra

ajoutez un cascade pour la mise à jour. résoudra le problème si des clés étrangères sont impliquées.

0
Tunde Pizzle

Si la clé primaire dans une table est mentionnée comme incrémentée automatiquement et que vous êtes obligée de donner explicitement une valeur, elle déclenchera une exception d'état Stale.

0
KABALI333