Hibernate继承相关异常:找不到未定义的memId属性
memId属性的问题 这种情况我之前也碰到过,明明实体类里没这个字段,Hibernate却硬要找它,确实挺闹心的。结合我踩过的坑,给你列几个最可能的原因,你可以逐一排查:
映射文件里的拼写错误或遗留配置
先去检查你的XML映射文件(比如XXX.hbm.xml),是不是不小心写了<property name="memId"/>,或者在关联映射(比如<many-to-one>、<one-to-many>)里误引用了memId?有时候旧版本的映射文件没清理干净,或者复制粘贴时带过来的残留配置,很容易触发这个问题。举个错误示例:<!-- 不小心遗留的错误配置 --> <many-to-one name="member" column="mem_id" property-ref="memId"/>这里的
property-ref如果指定了不存在的memId,就会直接抛出这个异常。JPA注解的错误关联配置
要是你用的是注解映射,赶紧检查@JoinColumn、@OneToMany这类关联注解里的referencedColumnName属性,是不是误写成了memId?比如:// 错误示例:referencedColumnName指定了不存在的属性 @ManyToOne @JoinColumn(name = "member_id", referencedColumnName = "memId") private Member member;如果Member实体的主键不是
memId(比如是id),Hibernate就会去寻找不存在的属性,直接报错。HQL/JPQL查询里的错误引用
有没有在写HQL或者JPQL查询的时候,不小心用到了memId?比如:FROM Order o WHERE o.memId = :memberId要是Order实体里根本没有
memId这个属性,Hibernate解析查询语句的时候就会抛出这个异常,这也是很常见的低级错误。命名策略的意外冲突
这种情况概率低,但也可以排查下:Hibernate的命名策略会不会把数据库表的字段名(比如mem_id)错误解析成memId?你可以检查下配置里的hibernate.implicit_naming_strategy和hibernate.physical_naming_strategy参数,看看是不是策略配置导致的属性名误匹配。字节码增强或动态代理的问题
如果你开启了Hibernate的字节码增强功能,或者用了某些AOP代理,会不会在动态生成的代理类里意外引入了memId属性?这种情况比较少见,但可以先临时禁用字节码增强,看看错误是否消失,来排除这个可能。
建议你按从上到下的顺序排查,一般前三个原因就能找到问题所在。
内容的提问来源于stack exchange,提问作者Carl Shiles

