一、报错
###Error querying database.
Cause: org.apache.ibatis.reflection.ReflectionException:Could not set property 'healhistorys' of 'class com.bean.Pet' with value
‘[com.bean.Healhistory@3a52dba3, com.bean.Healhistory@2a5c8d3f, com.bean.Healhistory@752325ad]’
Cause: org.apache.ibatis.reflection.ReflectionException:There is no setter for property named 'healhistorys' in 'class com.bean.Pet'
###The error may exist incom/mapping/HealhistoryMapper.xml
###The error may involve com.mapper.HealhistoryMapper.selectByPetid
###The error occurred while handling results
###SQL: select id, petId, health, checkdate from healhistory where petId = ?
根据上午报错我们可以知道它是再说:不能为 healhistorys
这个属性设置值,也没有为这个属性设置值的方法,还指明了出错的位置是在 com/mapping/HealhistoryMapper.xml
这个映射文件里。
二、分析
虽然是一个很简单的错误,但是对于自己这个新手来说,困扰了自己一下午时间都没能解决出来。开始自己一直以为是不是语法错了,然后一直看语法,也没能发现问题。
自己在bean层设置了这个属性,而且有setter和getter方法,所以排除了是没有setter方法的可能性。
而自己的错误原因是因为 property
属性名写错了:
由于代码是代码自动生成器生成的,bean层的属性没有使用驼峰式命名,自己还修改了一下属性,对应的代码都做了修改。唯有 healhistorys
这个属性的属性名写错了,可是xml文件的这个属性却显示的是绿色的。所以自己并没有过多的注意到是属性名写错了。
实体的属性名是下面这个,在xml文件中反而这个正确的属性名,它会报红,着实尴尬。
三、解决办法
- 属性名写错了。这个是最可能发生的原因,也是很难发现的细节错误。要解决这个错误,就需要将该property的值和对应的实体类里的属性名进行对应,或直接复制实体类里的属性名。
- 确实没有写setter方法,不过这个可能性一般较小。
- 语法错误。可对照一下语法结构,结果没问题,问题就在细节上。
四、感悟
感觉最麻烦的不是语法,因为语法是固定的,反而这些细节性的、很微小的书写问题,却是最能困扰初学者。