WildFly12+Hibernate5.1+JPA2.1报错:找不到Klijent#new的setter方法
我之前在使用Hibernate搭配JPA开发时也碰到过类似的诡异问题,结合你的环境(WildFly 12 + Hibernate 5.1 + JPA 2.1),虽然你已经实现了所有getter、setter和无参构造,但这个报错大概率是映射配置或查询语句里的隐性错误导致的,给你梳理几个排查方向:
检查JPQL/HQL查询是否误用了
new关键字或引用了不存在的属性
这是最常见的触发原因:- 如果你写了类似
SELECT new rs.co.bora5.programs.sevid.model.Klijent(k.id, k.name) FROM Klijent k的构造查询,但实体类中没有对应参数列表的构造函数,Hibernate可能会抛出这个误导性的错误; - 更可能的是,你不小心在查询里引用了一个不存在的属性
new(比如手滑打错了字段名),比如SELECT k.new FROM Klijent k,这时候Hibernate会自动尝试寻找setNew()方法,但你的实体里根本没有new这个属性,自然就报错了。
- 如果你写了类似
检查实体类的映射注解是否有误
看看你的Klijent类里有没有注解不小心把属性名映射成了new,比如:@Column(name = "new") private String someField;这种情况下,若Hibernate命名策略配置不当,可能会反向触发寻找
setNew()方法的逻辑,导致错误。检查SQL结果集映射(SqlResultSetMapping)配置
如果你用了原生SQL查询并配置了@SqlResultSetMapping,或者在XML里定义了结果映射,看看是不是不小心把某个<result>的property属性设成了new,比如:<result property="new" column="some_column_name"/>这种配置会让Hibernate尝试给
new属性赋值,找不到对应的setter就会报错。清理WildFly部署缓存
WildFly有时候会缓存旧的部署文件,即使你修改了实体类,缓存里的旧版本可能还在运行。试试删除WildFly安装目录下的standalone/tmp和standalone/deployments目录里的内容,然后重新部署你的应用。检查数据库表结构与Hibernate命名策略
如果你的数据库表中有一个名为new的列,而Hibernate的命名策略(比如PhysicalNamingStrategy)会自动将列名转换成实体属性名,这时候Hibernate会尝试在Klijent类中寻找对应的new属性和setter方法。如果实体里没有这个属性,就会触发报错。你可以修改实体映射或者调整命名策略来解决。
先从查询语句和映射配置开始排查,这些地方最容易出现隐性错误,应该能快速定位问题。
内容的提问来源于stack exchange,提问作者Borivoj Bogdanovic

