admin管理员组

文章数量:1637183

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

本文标签: HibernateMappingExceptionCausedorgcomposite