Caused by: org.hibernate.MappingException: Composite-id class must implement Serializable

复合主键与序列化
在使用SpringBoot和实体类含有复合主键时,需实现Serializable接口并自定义serialVersionUID,确保网络传输中对象的唯一标识,避免Composite-idclassmustimplementSerializable错误。

今天开发web的时候加了一个model类,启动springboot时导致了这个错误,记录一下

由于表中有两个id,所以添加了两个@id注解,导致了这个错误
两个注解
如果一个实体类对应的表拥有多个primary key,则要求该实体类必须可序列化,该类要实现 Serializable 接口,类后添加implements Serializable
然后默认生成 private static final long serialVersionUID = 1L;
重新启动即可。

根本原因是网络传输中,要求序列化的类必须有一个唯一的标识,该表示用来识别传输的对象,所以当序列化中有多个id的时候,必须加上该标识用来识别这个类的对象。

我们看serialVersionUID 从字面上来说就是序列化版本号,为什么两个@Id就必须要实现Serializable 接口,并且必须有这个样一个final类型的成员变量呢?

首先要明白序列化是要做什么用的:序列化就是为了传输一个Java对象用的,无论这个传输是传输到磁盘(IO)上,还是要进行网络传输。为了标识一个对象的唯一性,序列化的唯一ID就变得十分重要了。一个person对象如果传到另一端变成了grade对象,这种错误是不可接受的,因此我们给person对象一个唯一的序列化ID,到另一端收到这个内容,并进行反序列化时,可以发现这个ID,就会明白是person对象而不是grade对象。

当只有一个@Id的时候,Spring会根据这个id给你创建出来一个符合它认可的serialVersionUID。当你给两个字段都标识@Id的时候,Spring无法确定到底哪个才是应该做为serialVersionUID的值,所以必须由我们指定一个serialVersionUID才可以。

因此Composite-id class must implement Serializable这个错就是要提醒我们:请给当前类指定一个序列化ID。

这个问题可能是由于数据库字段包含了数据库的关键字或保留字所导致的。你可以检查一下映射文件中的表名、目录名,以及配置是否正确。有时,默认的配置是使用项目名称作为数据库名,所以当上传时可能会报错找不到。此外,还可以检查是否缺少了某些类文件,比如出现了`Caused by: java.lang.ClassNotFoundException: org.objectweb.asm.Type`异常。我们建议你仔细检查这些可能导致问题的因素,并进行相应的修复。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Caused by: org.hibernate.exception.SQLGrammarExcep](https://blog.csdn.net/venus224/article/details/83281470)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [org.hibernate.exception.SQLGrammarException错误](https://blog.csdn.net/wenzhenyu1990/article/details/8700130)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [Caused by: java.lang.ClassNotFoundException: org.apache.commons.collections.Transformer异常](https://download.csdn.net/download/weixin_38642864/12723222)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值