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

今天开发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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值