Spring boot+Spring Data Jpa + Hibernate 做新增操作时,默认把modifyTime当作版本。数据存储modifyTime的值是dataTime,当我们同一秒对数据库进行操作时,几条数据只能成功一条。其他的就报下面的错误。但是我们并没有在实体类中modifyTime属性上加上@Version之类的注解,不知道各位有木有遇到过这个问题。org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect) : [com.ktwlsoft.framework.basicplatform.entity.general.SysSmsTemplateEntity#4028b3536bda236b016bdaa8c2470017]
at org.hibernate.persister.entity.AbstractEntityPersister.check(AbstractEntityPersister.java:2525)
at org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:3357)
at org.hibernate.persister.entity.AbstractEntityPersister.updateOrInsert(AbstractEntityPersister.java:3231)
at org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:3632)
at org.hibernate.action.internal.EntityUpdateAction.execute(EntityUpdateAction.java:146)
at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:604)
at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:478)
at org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:356)
at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:39)
at org.hibernate.internal.SessionImpl.doFlush(SessionImpl.java:1453)
at org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:510)
at org.hibernate.internal.SessionImpl.flushBeforeTransactionCompletion(SessionImpl.java:3282)
at org.hibernate.internal.SessionImpl.beforeTransactionCompletion(SessionImpl.java:2478)
at org.hibernate.engine.jdbc.internal.JdbcCoordinatorImpl.beforeTransactionCompletion(JdbcCoordinatorImpl.java:473)
at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl.beforeCompletionCallback(JdbcResourceLocalTransactionCoordinatorImpl.java:178)
at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl.access$300(JdbcResourceLocalTransactionCoordinatorImpl.java:39)
at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl$TransactionDriverControlImpl.commit(JdbcResourceLocalTransactionCoordinatorImpl.java:271)
at org.hibernate.engine.transaction.internal.TransactionImpl.commit(TransactionImpl.java:104)

解决方案 »

  1.   

    已经确定是这个字段了,当我把字段的类型修改为varchar时,插入的时间会有毫秒数在后面,这样手动点击测试就不会报错了!当然理论上只要是在同一毫秒还是会有这个问题。而且DBA创建数据库的时候是基本上所有的表都有这个字段,我不可能把数据库所有的表的modifyTime字段修改成varchar的求助!!!
    --------------------------------------------------------------------------
      

  2.   

    hibernate乐观锁
      

  3.   

    是的,又有了新的发现!
    其实他不是针对我的modifyTime字段,而是整条数据,他在执行update之前会先自己调用了一条select然后跟我将要执行的数据做对比,如果内容一样就报上面的错误了!如果内容不一样就不报错!
    现在就想去掉这个验证!