wake-up-neo.net

org.hibernate.StaleStateException: Die Stapelaktualisierung hat eine unerwartete Zeilenzahl von Aktualisierung [0] zurückgegeben. tatsächliche Reihenanzahl: 0; erwartet

Ich erhalte diese Fehlermeldung, wenn ich versuche, Werte in meiner Datenbank aus meiner Frühlings-MVC-Anwendung zu aktualisieren: 

 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)

Mein tatsächlicher Fehler scheint also etwas mit den IDs in der Datenbank zu sein und was aktualisiert wird ... In meiner GET-Methode erhalte ich die aktuelle ID, die in diesem Fall 10 ist.

@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;

}

Aber in meiner Post-Methode ist diese ID, die 10 war, plötzlich 0, was meiner Meinung nach die Ursache dieses Fehlers sein könnte.

@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";
        }

Was könnte dann die Ursache sein oder ist der Fehler etwas anderes?

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...

JPA-Klasse: 

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

Dieser Fehler wird normalerweise verursacht, wenn der Ruhezustand nicht alle Zeilen findet, die aktualisiert werden müssen. Dies bedeutet, dass beim Versuch, einige Objekte zu aktualisieren, die aus der Datenbank gezogen wurden, diese nicht mehr wirklich vorhanden sind (oder nie in der Datenbank vorhanden waren) erster Platz).

Dies kann daran liegen, dass ein anderer Thread sie löscht oder dass der Isolationsmodus der DB auf read_uncommited gesetzt ist und Zeilen, die von einer anderen Transaktion erstellt wurden, nicht gespeichert werden konnten (aufgrund eines Transaktionsfehlers) und nicht mehr vorhanden sind.

14
David Fischer

Die einzige Möglichkeit, genau zu wissen, was passiert, ist das Aktivieren der Protokollierung der Hibernate-Anweisung in Ihrer Hibernate.cfg.xml-Konfiguration. Das liegt daran, dass keine der Zeilennummern in der Stack-Ablaufverfolgung dem Teil Ihres Codes entspricht, der die eigentliche Hibernate-Operation ausgeführt hat. Stattdessen werden die Vorgänge stapelweise ausgeführt und dann beim Schließen der Transaktion (oder nachdem eine festgelegte Anzahl von Vorgängen stapelweise ausgeführt wurde) auf einmal ausgeführt. 

So aktivieren Sie die Protokollierung der Ruhezustand-Anweisung

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

Das letzte Mal, als ich auf dieses Problem stieß, war es der Fall, dass ein Datensatz durch ein allgemeines HQL-Update in einem anderen Thread/einer anderen Transaktion gelöscht wurde. Der aktuelle Thread/die aktuelle Transaktion versuchte, den gleichen Datensatz nach ID zu löschen. Da die Transaktion stapelweise ist, wird sie leider nicht an dem Punkt angezeigt, an dem Sie den Löschvorgang durchgeführt haben, sondern zu einem späteren Zeitpunkt in der Programmausführung. Daher muss die Anweisungsprotokollierung aktiviert werden, um zu ermitteln, welche Hibernate-Operation die Ausnahme ausgelöst hat.

10
eric.green
  • Ich habe diese Fehlermeldung erhalten, weil ich Daten aktualisieren wollte und verwendet habe

    service.update (Benutzer);

  • Aber dann habe ich zu Testzwecken die Benutzertabelle gelöscht und vergessen, die Methode in zu ändern 

    service.saveOrUpdate (Benutzer);

  • Also habe ich es geändert und das Problem wurde gelöst.

2
Gadhia Reema

Ich stieß auf ein ähnliches Problem, bei dem ich versuchte, ein Objekt zu speichern, in dem seine ID ein primitives Feld (lang) war. Zum Zeitpunkt der Erstellung des Objekts war die ID standardmäßig auf 0 gesetzt, und Hibernate nahm an, dass ich aktualisieren wollte die Zeile mit id = 0 (die offensichtlich nicht existiert).

Meine Lösung bestand darin, das ID-Feld in Long (Wrapper) zu ändern. Auf diese Weise wird beim Erstellen einer neuen Instanz die ID auf NULL gesetzt, und Hibernate versteht, dass ich ein neues Element in die Datenbank einfüge.
Ich hoffe, es hilft. Vielen Dank.

1

Prüfen Sie, ob die Variable des Objekts, die als Id (die eine Generatorklasse verwendet) dem Hibernate zugeordnet ist, überhaupt keinen veralteten Wert enthält.

Wenn der Datensatz von einem anderen Thread oder einer anderen Operation gelöscht wurde, die Id-Variable jedoch immer noch den veralteten Wert enthält und wenn Sie den Datensatz in der Datenbank aktualisieren, erhalten Sie diese Ausnahme, da für die angegebene ID kein Datensatz vorhanden ist in der DB und daher müssen Sie das Objekt speichern, statt zu aktualisieren, da der Datensatz überhaupt nicht aktualisiert werden kann

Oder aber

Legen Sie die ID als NULL fest, wenn Sie die saveOrUpdate-Methode verwenden.

1
Bhuvanesh s

Ich hatte ein ähnliches Problem und als ich cascade='save-update' hinzufügte, wurden meine Probleme behoben.

Dies ist mein Fix mit CF Application gearbeitet.

1
Manjeet Mahto

Geben Sie einfach save anstelle von saveOrUpdate in Ihre Hibernate-Abfrage ein. Dies liegt an früheren Protokollen, in denen Ihre Klasse eine andere ID generiert, die zuvor in Ihrer Tabelle gespeichert wurde. Der Hibernat versucht also, mit derselben ID zu aktualisieren, und er findet keine Zeile mit dieser ID, so dass eine staleStateException ausgegeben wird.

1
user3785877

manchmal verwenden wir die Generatorklasse zum Generieren des Primärschlüssels einer Zeile ... aber wir fügen ihn im Programm zum Zeitpunkt hinzu, zu dem wir stalestateException erhalten.

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% Lösung: 1 Stellen Sie sicher, dass die ID in der Tabelle automatisch inkrementiert wird Alle Fremdschlüssel sind nicht null Der Gültigkeitsbereich ist session 

1
Martin

Das habe ich auch in meiner Spring Boot App gesehen. Mein Fall ist wie folgt: Outter-Methode mit @Transaction kommentiert. Darin habe ich zwei verschiedene Methoden: Methode 1 löscht Datensätze, die auch @Transaction haben. Methode 2 liest dieselben Datensätze, die auch mit @Transaction kommentiert sind. Hier tritt das Problem auf, weil standardmäßig die @ Transaction-Annotation Propagation.REQUIRED unterstützt wird, die die aktuelle Transaktion verwendet. Wenn ich also in Methode 2 versuche, die Daten zu lesen, bekomme ich offensichtlich eine veraltete Ausnahme. Die Lösung, die für mich funktioniert, ist, dass ich Methode 1 mit @Transactional (propagation = Propagation.REQUIRES_NEW) annotiere.

Daher verwendet Methode 2 immer eine separate Transaktion, die keine veralteten Daten enthält.

1
Ashish Sharma

Geben Sie das Anmerkungsattribut in der übergeordneten Entitätsklasse an: -

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

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

füge eine cascade für ein Update hinzu. löst das Problem, wenn Fremdschlüssel involviert sind.

0
Tunde Pizzle

Wenn der Primärschlüssel in einer Tabelle als automatisch erhöht angezeigt wird und Sie den Wert explizit angeben müssen, wird der Status "Ausgenommen" ausgelöst.

0
KABALI333