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