JPA 复合主键含自增id

news/2025/2/13 23:24:50/

为了使用分区,需要在主键里加入分区字段,主键变为复合主键,包含自增的id和一个分区的字段part。不正确的java代码+建表语句,会导致下述错误。

  1. 导致下述错误的原因:在IdClass里的自增id属性,有注解@GeneratedValue(strategy = GenerationType.IDENTITY)

Can not set java.lang.Long field PK.id to org.hibernate.id.IdentifierGeneratorHelper

Caused by: org.hibernate.PropertyAccessException: Could not set field value [POST_INSERT_INDICATOR] value by reflection : [class com.cc.ai.demo.entity.SearchVecPK.id] setter of com.cc.ai.demo.entity.SearchVecPK.id
at org.hibernate.property.access.spi.SetterFieldImpl.set(SetterFieldImpl.java:72)
at org.hibernate.mapping.Component$ValueGenerationPlan.execute(Component.java:510)
at org.hibernate.id.CompositeNestedGeneratedValueGenerator.generate(CompositeNestedGeneratedValueGenerator.java:97)
at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:115)
at org.hibernate.event.internal.DefaultMergeEventListener.saveTransientEntity(DefaultMergeEventListener.java:271)
at org.hibernate.event.internal.DefaultMergeEventListener.entityIsTransient(DefaultMergeEventListener.java:243)
at org.hibernate.event.internal.DefaultMergeEventListener.entityIsDetached(DefaultMergeEventListener.java:318)
at org.hibernate.event.internal.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:172)
at org.hibernate.event.internal.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:70)
at org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:93)
at org.hibernate.internal.SessionImpl.fireMerge(SessionImpl.java:793)
at org.hibernate.internal.SessionImpl.merge(SessionImpl.java:780)
at sun.reflect.GeneratedMethodAccessor156.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at > org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:314)
at com.sun.proxy.$Proxy145.merge(Unknown Source)
at org.springframework.data.jpa.repository.support.SimpleJpaRepository.save(SimpleJpaRepository.java:557)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.data.repository.core.support.ImplementationInvocationMetadata.invoke(ImplementationInvocationMetadata.java:72)
at org.springframework.data.repository.core.support.RepositoryComposition$RepositoryFragments.invoke(RepositoryComposition.java:382)
at org.springframework.data.repository.core.support.RepositoryComposition.invoke(RepositoryComposition.java:205)
at org.springframework.data.repository.core.support.RepositoryFactorySupport$ImplementationMethodExecutionInterceptor.invoke(RepositoryFactorySupport.java:550)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.doInvoke(QueryExecutorMethodInterceptor.java:155)
at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.invoke(QueryExecutorMethodInterceptor.java:130)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
at org.springframework.data.projection.DefaultMethodInvokingMethodInterceptor.invoke(DefaultMethodInvokingMethodInterceptor.java:80)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:367)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:118)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:139)
… 86 common frames omitted
Caused by: java.lang.IllegalArgumentException: Can not set java.lang.Long field com.cc.ai.demo.entity.SearchVecPK.id to org.hibernate.id.IdentifierGeneratorHelper$2
at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:167)
at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:171)
at sun.reflect.UnsafeObjectFieldAccessorImpl.set(UnsafeObjectFieldAccessorImpl.java:81)
at java.lang.reflect.Field.set(Field.java:764)
at org.hibernate.property.access.spi.SetterFieldImpl.set(SetterFieldImpl.java:52)
… 121 common frames omitted

  1. 导致id null exception的原因,数据库表没有auto_increment.

正确的复合主键构造方式:

@Entity
@Getter
@Setter
@ToString
@IdClass(SearchVecPK.class)
@Table(name = "search_vec")
public class SearchVecEntity {@Id@GeneratedValue // GenerationType.AUTOprivate Long id;@Idprivate int part;private String appId;
public class SearchVecPK implements Serializable {private Long id;private int part;
}
CREATE TABLE `search_vec` (`id` bigint(20) NOT NULL AUTO_INCREMENT,`app_id` varchar(255) DEFAULT NULL,`part` int(11) NOT NULL,PRIMARY KEY (`id`,`part`) USING BTREE,UNIQUE KEY `UKqssgibuhvjumx98hexjpw0o3c` (`part`,`user_id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=76 DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC
/*!50100 PARTITION BY RANGE ( part)
(PARTITION p1 VALUES LESS THAN (1) ENGINE = InnoDB,PARTITION p2 VALUES LESS THAN (2) ENGINE = InnoDB)

执行:

       SearchVecEntity searchVecEntity = new SearchVecEntity();searchVecEntity.setPart(keyPart.getPart());searchVecEntity.setGroupId(key); // todo. where should this groupId set? not here.SearchVecEntity save = repository.save(searchVecEntity);

从结果可以看到save的id字段已经赋值。
参考:
https://www.jianshu.com/p/a7779a29bca5/


http://www.ppmy.cn/news/2296.html

相关文章

CN_集线器@网桥和交换机@碰撞域

文章目录网桥和交换机碰撞域集线器(Hub)网桥交换机工作原理转发表/MAC地址表表项缺失的维护第二层不足工作方式学习泛洪确认转发过滤老化特点网络容量优点端口和带宽问题例例集线器和交换机综合案例网桥和交换机 碰撞域 Collision domain - Wikipedia 碰撞域是指共享同一信道…

5年测试,面试结束后被HR怼了..(心塞)

前一阵子向朋友诉苦,我在参加字节跳动面试的时候被面试官怼得哑口无言,场面让我一度十分尴尬。印象最深的就是下面几个问题: 根据你以前的工作经验和学习到的测试技术,说说你对质量保证的理解?非关系型数据库和关系型数…

【Linux】yum的介绍和使用

本期主题:yum介绍和使用博客主页:小峰同学分享小编的在Linux中学习到的知识和遇到的问题小编的能力有限,出现错误希望大家不吝赐作为程序员,不会有人还没女朋友吧。 目录 🍁1.软件包是什么? 🍁…

[附源码]计算机毕业设计剧本杀交流分享平台Springboot程序

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

实现异步转同步的几种方式

循环等待实现异步转同步 在循环等待中,我们可以使用一个变量来指示异步操作是否已完成。然后,我们可以在循环中检查该变量,如果它指示异步操作已完成,则退出循环。 否则,我们可以让线程等待一段时间,然后…

「图文教程」iOS 16测试版如何升级iOS 16正式版?

苹果iOS 16正式版已经更新到iOS 16.1.2了,如果你的iPhone之前为了尝鲜已经下载安装iOS 16测试版,该如何升级iOS 16正式版呢?一起来了解下吧! 方法一、移除iOS 16 Beta描述文件 1、进入【设置】-【通用】-【VPN与设备管理】&…

【linux】进程的概念与控制

目录 冯诺依曼体系结构 操作系统(Operator System) 进程 基本概念 组织进程 查看进程 进程状态 僵尸进程危害 环境变量 程序地址空间 挂起 进程创建 写时拷贝 进程终止 _exit函数 exit函数 参数: 冯诺依曼体系结构 我们常见的计算机,如…

利用pymupdf编辑修改pdf

利用pymupdf编辑修改pdf 本文背景 为了修改pdf的文本, 在pymupdf官方手册查了一通,没看到明显的说明,然后到github的讨论区看了发现了修改pdf的方案,在此记录一下 参考链接: https://github.com/pymupdf/PyMuPDF/discussions/1019 主要方法: 找到需要替换的文本块,然后添…