升级Spring与Hibernate后出现IllegalArgumentException错误求助
错误信息
Caused By: java.lang.IllegalArgumentException: Expecting collection type [java.lang.Object]
at org.hibernate.metamodel.internal.AttributeFactory.determineCollectionType(AttributeFactory.java:982)
at org.hibernate.metamodel.internal.AttributeFactory$PluralAttributeMetadataImpl.(AttributeFactory.java:827)
at org.hibernate.metamodel.internal.AttributeFactory$PluralAttributeMetadataImpl.(AttributeFactory.java:808)
at org.hibernate.metamodel.internal.AttributeFactory.determineAttributeMetadata(AttributeFactory.java:587)
at org.hibernate.metamodel.internal.AttributeFactory.buildAttribute(AttributeFactory.java:92)
排查方向
1. 实体类集合属性类型校验
Hibernate 5.5+对集合映射的类型校验大幅收紧,XML中定义的集合标签(bag/set/list/map)必须对应实体类中标准Java集合类型(java.util.List/Set/Map等),不能是Object或自定义非集合类型。如果实体类中属性定义为private Object xxx;但XML映射成集合,直接触发该错误。
2. XML映射元素类型配置
检查集合标签内的<element>/<one-to-many>/<many-to-many>的类型配置:
- 必须明确指定具体类型(实体类全限定名或基础类型),不能遗漏或错误指定为
java.lang.Object; - 确保
of-type属性(如果使用)与实际元素类型一致。
3. 注解与XML映射冲突排查
若实体类同时使用JPA注解(如@ElementCollection/@OneToMany)和XML定义集合,Hibernate 5.6会严格校验两者一致性,冲突配置会导致元模型生成时类型判断错误。建议统一使用一种映射方式,或确保两者配置完全匹配。
4. XML映射语法错误检查
排查XML中的拼写或配置错误:
- 集合标签的
name属性必须与实体类中集合属性名完全一致; - 避免错误配置
class属性(比如将集合元素的class写成java.lang.Object); - 检查是否有未闭合的标签或命名空间错误。
5. 过时配置清理
Spring 5.3.31与Hibernate 5.6.15兼容,但需清理LocalSessionFactoryBean中的过时配置:
- 移除自定义的
TypeResolver或MetadataBuilder修改器; - 确保
hibernate.properties中没有过时的元模型生成相关配置。
内容的提问来源于stack exchange,提问作者Regev avital

