java - @Version 在插入期间抛出 IncompleteClassChangeError

标签 java postgresql hibernate spring-boot

我在实体中遇到 @Version 的乐观锁问题

没有@Version,所有操作都可以正常工作,但我需要版本控制和锁定。

@NoArgsConstructor
@Data
@Builder
@EqualsAndHashCode(of = "id")
@AllArgsConstructor
@Entity
public class Person  
{  
    .............. others fields and id

   @Version
   @Column(name = "_version", columnDefinition = "integer DEFAULT 0", nullable = false)
   private Integer version;
}

并使用@Transaction创建实体代码:

Person person = new Person();
person.setName("Pike");

personRepository.saveAndFlush(person);

和简单的存储库:

public interface PersonRepository extends JpaRepository<Person, Long> {
}

此代码在创建 Person 期间抛出:

java.lang.IncompatibleClassChangeError: null
    at org.springframework.data.jpa.repository.support.JpaMetamodelEntityInformation$$Lambda$805/2119034561.apply(Unknown Source) ~[?:?]
    at java.util.Optional.map(Optional.java:215) ~[?:1.8.0_20]
    at org.springframework.data.jpa.repository.support.JpaMetamodelEntityInformation.isNew(JpaMetamodelEntityInformation.java:230) ~[spring-data-jpa-2.0.4.RELEASE.jar:2.0.4.RELEASE]
    at org.springframework.data.jpa.repository.support.SimpleJpaRepository.save(SimpleJpaRepository.java:489) ~[spring-data-jpa-2.0.4.RELEASE.jar:2.0.4.RELEASE]
    at org.springframework.data.jpa.repository.support.SimpleJpaRepository.saveAndFlush(SimpleJpaRepository.java:504) ~[spring-data-jpa-2.0.4.RELEASE.jar:2.0.4.RELEASE]
    at sun.reflect.GeneratedMethodAccessor126.invoke(Unknown Source) ~[?:?]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_20]
    at java.lang.reflect.Method.invoke(Method.java:483) ~[?:1.8.0_20]
    at org.springframework.data.repository.core.support.RepositoryComposition$RepositoryFragments.invoke(RepositoryComposition.java:377) ~[spring-data-commons-2.0.9.RELEASE.jar:2.0.9.RELEASE]
    at org.springframework.data.repository.core.support.RepositoryComposition.invoke(RepositoryComposition.java:200) ~[spring-data-commons-2.0.9.RELEASE.jar:2.0.9.RELEASE]
    at org.springframework.data.repository.core.support.RepositoryFactorySupport$ImplementationMethodExecutionInterceptor.invoke(RepositoryFactorySupport.java:629) ~[spring-data-commons-2.0.9.RELEASE.jar:2.0.9.RELEASE]
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185) ~[spring-aop-5.0.8.RELEASE.jar:5.0.8.RELEASE]
    at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.doInvoke(RepositoryFactorySupport.java:593) ~[spring-data-commons-2.0.9.RELEASE.jar:2.0.9.RELEASE]
    at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.invoke(RepositoryFactorySupport.java:578) ~[spring-data-commons-2.0.9.RELEASE.jar:2.0.9.RELEASE]
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185) ~[spring-aop-5.0.8.RELEASE.jar:5.0.8.RELEASE]
    at org.springframework.data.projection.DefaultMethodInvokingMethodInterceptor.invoke(DefaultMethodInvokingMethodInterceptor.java:59) ~[spring-data-commons-2.0.9.RELEASE.jar:2.0.9.RELEASE]
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185) ~[spring-aop-5.0.8.RELEASE.jar:5.0.8.RELEASE]
    at org.springframework.transaction.interceptor.TransactionInterceptor$$Lambda$731/1432027166.proceedWithInvocation(Unknown Source) ~[?:?]
    at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:294) ~[spring-tx-5.0.8.RELEASE.jar:5.0.8.RELEASE]
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:98) ~[spring-tx-5.0.8.RELEASE.jar:5.0.8.RELEASE]
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185) ~[spring-aop-5.0.8.RELEASE.jar:5.0.8.RELEASE]
    at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:139) ~[spring-tx-5.0.8.RELEASE.jar:5.0.8.RELEASE]
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185) ~[spring-aop-5.0.8.RELEASE.jar:5.0.8.RELEASE]
    at org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$CrudMethodMetadataPopulatingMethodInterceptor.invoke(CrudMethodMetadataPostProcessor.java:135) ~[spring-data-jpa-2.0.4.RELEASE.jar:2.0.4.RELEASE]
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185) ~[spring-aop-5.0.8.RELEASE.jar:5.0.8.RELEASE]
    at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92) ~[spring-aop-5.0.8.RELEASE.jar:5.0.8.RELEASE]
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185) ~[spring-aop-5.0.8.RELEASE.jar:5.0.8.RELEASE]
    at org.springframework.data.repository.core.support.SurroundingTransactionDetectorMethodInterceptor.invoke(SurroundingTransactionDetectorMethodInterceptor.java:61) ~[spring-data-commons-2.0.9.RELEASE.jar:2.0.9.RELEASE]
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185) ~[spring-aop-5.0.8.RELEASE.jar:5.0.8.RELEASE]
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:212) ~[spring-aop-5.0.8.RELEASE.jar:5.0.8.RELEASE]
    at com.sun.proxy.$Proxy150.saveAndFlush(Unknown Source) ~[?:?]

为什么会抛出这个错误?

我看不到错误,这是乐观锁的标准代码。

我使用的项目:

  • Spring 启动:2.0.4.RELEASE
  • Spring 版本:5.0.2.RELEASE
  • hibernate 核心:5.4.1.Final
  • postgresql jdbc:42.2.5

我在网上没有发现类似的问题

最佳答案

问题可能是因为版本位于 _version 列上,并且没有为该列设置值。

为该列设置一个值可能会解决该问题。

Person person = new Person();
person.setName("Pike");
person.setVersion(1);// Or any meaningful value there

关于java - @Version 在插入期间抛出 IncompleteClassChangeError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57444896/

相关文章:

java - 创建一个添加方法,如果重复,则不会添加到列表中?

java - 如何检查互联网连接(Wifi/移动数据)是否已启用?

sql - 使用单个查询在 postgres 数据库中搜索多个表?

java - 如何将带有 mongoDB 项目的 spring 4 + Hibernate 切换到 MySQL?

java - 如何在散列之前验证最小、最大密码长度?

java - 过滤掉文本文件

java - 在java中编辑对象二维数组的字段

sql - CTE - 使用更新的记录和 upsert 语句

sql - 与更新 Postgres 文件夹中的表的日期转换相关的类型错误

java - 我们可以在简单的网站 cPanel 中部署 .war 文件吗?