异常信息:com.jfinal.plugin.activerecord.ActiveRecordException: The attribute name does not exist: XXX
背景:在Jfinal框架中,实体类JavaBean需要和数据库表的字段绑定,使用注解@Table(tableName = "tableName", primaryKey = "OL_NBR"),来绑定数据库表,和主键。不需要写列字段属性,直接写setter,getter方法,其中set,get中字段对应表中字段。
public void setCityId(String cityId) {
set("CITY_ID", cityId);
}
public String getCityId() {
return getStr("CITY_ID");
}
问题出现:当我们业务需要实体类中增加其他表字段(不在当前实体类对应表中);比如Student 表中有 id、name、 age、 sex等字段,实体类也对应这4个字段的setter getter方法,现在我想加一个字段,总共选修了多少门课程:course_count, 于是在student中增加 setCourse_count, getCourse_count两个方法。于是, new 一个student后,然后直接set
Student student = new Student();
student.setCourse_count(3);
这段代码,看起来没问题,写个main(),静态的代码执行也没问题。但是当项目启动时,就会抛出异常:The attribute name does not exist: XXX,
原因:当我们调用 setter方法时,实际是执行的setter方法里面 set(attr, value)方法,也就是Jfinal 框架中抽象类Model的 public M set(String attr, Object value)方法,该方法在 setter前会检查 com.jfinal.plugin.activerecord有没有和数据库表绑定,就是前面 @Table注解的表名,如果绑定了那么久检查表中是否存在该字段,不存在就抛出该异常,如下图:
同样,如果直接student的set(String attr, Object value)方法
Student student = new Student();
student.set("course_count", 3);
也是进入Model里面,同样抛出异常。
解决:
聪明如你,能找到Model这个抽象类,那一定会多看一些其他的方法实现。就在 set方法下面紧挨着就有一个put方法:
方法中 校验表中是否存在该字段的逻辑是注释掉的,我使用的是Jfinal.4.9版本。思考:我想这也应该是官方后来预想到的,才扩展的吧。不管怎么说,用就可以了。
正确的做法,就是使用 Model.put(String key, Object value),
Student student = new Student();
student.put("course_count",3);