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)
したがって、私の実際のエラーは、データベース内のIDと更新されたものに関連するもののようです。 GETメソッドでは、現在のID(この場合は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;
}
しかし、私の投稿方法では、10だったこのIDは突然0になりますが、これはこのエラーの原因でしょうか?
@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";
}
何がこの原因である可能性がありますか、またはエラーは他の何かですか?
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クラス:
@Override
public Person getPerson(int personId) {
return (Person)session.getCurrentSession().get(Person.class, personId);
}
このエラーは通常、休止状態が更新する必要のあるすべての行を見つけることができない場合に発生します。つまり、DBからプルされたオブジェクトを更新しようとすると、実際にはもう存在しない(またはそもそも存在しなかった)ということです。
別のスレッドがそれらを削除している、またはDBの分離モードがread_uncommitedに設定されているため、別のトランザクションによって作成された行が(トランザクションの失敗により)保存できず、もう存在しない可能性があります。
exactlyへの唯一の方法は、Hibernate.cfg.xml構成でHibernateステートメントのロギングを有効にすることです。これは、スタックトレースの行番号が、実際のHibernate操作を実行したコードの一部に対応していないためです。代わりに、操作はバッチ処理され、トランザクションの終了時(または指定された数の操作がバッチ処理された後)に一度に実行されます。
Hibernateステートメントのロギングを有効にするには、
<property name="show_sql">true</property>
<property name="format_sql">true</property>
<property name="use_sql_comments">true</property>
とはいえ、前回この問題に遭遇したのは、別のスレッド/トランザクションでの一般的なHQL更新によってレコードが削除され、現在のスレッド/トランザクションがIDによってまったく同じレコードを削除しようとした場合です。残念ながら、トランザクションはバッチ処理されるため、削除を行った時点では表示されませんが、プログラムの実行後のある時点で表示されます。したがって、ステートメントロギングをオンにして、どの実際のHibernate操作が例外をトリガーしたかを確認する必要があります。
データを更新したいので、このエラーが発生しました
service.update(user);
しかし、その後、テスト目的でUserテーブルをクリアし、メソッドを
service.saveOrUpdate(user);
したがって、私はそれを変更し、問題は解決しました。
同様の問題があり、cascade='save-update'
を追加すると問題が解決しました。
これは、CFアプリケーションで動作する修正です。
私は同様の問題に遭遇しました。彼のIDがプリミティブフィールド(長い)であるオブジェクトを保存しようとしており、オブジェクトの作成時にIDがデフォルトで0に設定されていたため、Hibernateは更新したいと思いましたid = 0の行(これは明らかに存在しません)。
私の解決策は、idフィールドをLong(ラッパー)に変更することでした。そのため、新しいインスタンスを作成すると、idがnullに設定され、Hibernateは新しい要素をデータベースに挿入することを理解します。
お役に立てば幸いです。ありがとう。
Id(ジェネレータークラスを使用)としてHibernateにマップされるObjectの変数に、最初から古い値が含まれていないかどうかを確認します。
レコードが別のスレッドまたは操作によって削除されたが、ID変数にまだ古い値が含まれていて、DBのレコードを更新しようとすると、指定されたIDのレコードがないため、この例外が発生しますDB内にあるため、最初にレコードを更新する範囲がないため、更新する代わりにオブジェクトを保存する必要があります。
または
SaveOrUpdateメソッドを使用している場合、idをnullに設定します。
休止状態クエリでsave
の代わりにsaveOrUpdate
と入力するだけです。これは、クラスが以前にテーブルに保存されていた他のIDを生成している以前のログによるものです。そのため、hibernateは同じIDで更新しようとしますが、そのIDを持つ行は見つからないため、staleStateException
を返します。
いくつかの場合、ジェネレータクラスを使用して行の主キーを生成しますが、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");
}
100%解決策:1テーブルのIDがすべての外部キーがnullではない自動インクリメントであることを確認してください
Springブートアプリでもこれに直面していました。私の場合は次のようになります:@Transactionアノテーションが付けられたOutterメソッド。この中に、2つの異なる方法があります。方法1は、@ Transactionも持つレコードを削除します。方法2は同じレコードを読み取り、@ Transactionアノテーションも付けられます。ここで問題が発生するのは、デフォルトで@Transactionアノテーションが現在のトランザクションを使用するPropagation.REQUIREDをサポートしているためです。したがって、方法2では、データを読み取ろうとすると、明らかに古い例外が発生します。私のために働く修正は、@ Transactional(propagation = Propagation.REQUIRES_NEW)でメソッド1に注釈を付けることです
そのため、方法2では、古いデータを持たない別のトランザクションを常に使用します。
親エンティティクラス内の注釈属性の下に指定:-
import javax.persistence.CascadeType
import javax.persistence.FetchType
@OneToMany(targetEntity = PhoneNumber.class, cascade = CascadeType.ALL, fetch = FetchType.LAZY, orphanRemoval = true)
更新用にcascadeを追加します。外部キーが関係する場合、問題を解決します。
テーブル内の主キーが自動インクリメントとして言及され、値を明示的に指定することを強制すると、失効状態例外がスローされます。