Spring项目中ManyToMany关联引发InvalidClassException错误求助
先给你拆解一下这个错误的核心:你遇到的java.io.InvalidClassException是因为**User实体类的serialVersionUID前后不匹配**——数据库里之前序列化存储的对象用的旧ID是-5953916207201729314,但现在你的本地User类用的新ID是-8613364070144931169,Hibernate在从数据库读取数据反序列化的时候,发现两个ID对不上,直接抛出了异常。
这种情况通常是因为你修改了User或者关联的Event实体类的结构,但没处理序列化ID的问题,或者数据库里已经有旧数据残留导致的。下面给你几个具体的解决步骤:
统一serialVersionUID,兼容旧数据
如果你想保留数据库里已有的数据,直接把User类里的serialVersionUID改成错误提示里的旧值就行:public class User implements Serializable { // 改成错误里的旧ID private static final long serialVersionUID = -5953916207201729314L; // 其他字段和关联配置... }同时记得给
Event类也显式加上固定的serialVersionUID,避免后续修改类结构时再出现同样的问题。清空旧数据,重新初始化
要是你不需要保留旧数据,直接清空数据库里的user、event以及它们的中间关联表(比如event_user),然后用当前的serialVersionUID重新启动项目,插入新数据就可以解决问题。检查实体类的序列化合规性
回忆下最近有没有修改过User或Event的结构:比如新增/删除字段、修改字段类型、调整继承关系,这些操作如果没有显式指定serialVersionUID,JVM会自动生成一个新的ID,导致和旧数据不兼容。一定要给所有实现Serializable的实体类显式声明serialVersionUID,这是个能避免很多坑的好习惯。排查ManyToMany关联的映射配置
检查下你的双向ManyToMany关联配置是否正确,避免因为映射错误导致Hibernate把集合序列化存储:// User类(维护端的反向关联) @ManyToMany(mappedBy = "users") private Set<Event> events = new HashSet<>(); // Event类(关联维护端) @ManyToMany @JoinTable( name = "event_user", joinColumns = @JoinColumn(name = "event_id"), inverseJoinColumns = @JoinColumn(name = "user_id") ) private Set<User> users = new HashSet<>();确保用的集合类是可序列化的(比如
HashSet、ArrayList),别用自定义的不可序列化集合。清理Hibernate二级缓存
如果你的项目启用了二级缓存,缓存里可能还存着旧的序列化对象,导致反序列化失败。可以直接重启应用服务器,或者调用缓存框架的清理接口(比如Ehcache的cacheManager.clearAll())来清除缓存。
内容的提问来源于stack exchange,提问作者Todor Dimitrov

