老師,metaObject.hasSetter在insert時能判斷字段是否存在,在update時不判斷統(tǒng)一返回為true
老師,按照教程,我在代碼中,在insertFill和updateFill中都對要自動填充的字段進(jìn)行了判斷如下
@Override public?void?insertFill(MetaObject?metaObject)?{ ????if?(metaObject.hasSetter("createTime"))?{ ????????log.info("自動插入"); ????????LocalDateTime?current?=?LocalDateTime.now(); ????????this.setInsertFieldValByName("createTime",?current,?metaObject); ????} } @Override public?void?updateFill(MetaObject?metaObject)?{ ????if?(metaObject.hasSetter("updateTime"))?{ ????????log.info("自動更新字段"); ????????LocalDateTime?current?=?LocalDateTime.now(); ????????this.setUpdateFieldValByName("updateTime",?current,?metaObject); ????} }
經(jīng)過debug發(fā)現(xiàn),metaObject.hasSetter在insert時,底層調(diào)用的是BeanWrapper.hasSetter的方法,能判斷是否包含了要設(shè)置的字段。
但是在update時,底層調(diào)用的是MapWrapper.hasSetter方法,這個方法直接返回true,并不判斷是否包含要設(shè)置的字段,導(dǎo)致自動metaObject.hasSetter的判斷不起作用,如下是debug截圖。
我使用的mp版本是3.2.0。更新時調(diào)用的方法是updateById,不明白為什么在更新時沒有調(diào)用BeanWrapper方法,而是調(diào)用MapWrapper
2020-03-23
同學(xué),你使用3.3.1.tmp版本試試,看看好不好使,我使用這個版本,debug時,看著調(diào)用的是BeanWrapper。
2020-10-26
和
在用法上沒有區(qū)別,是可以使用的
2020-10-26
老鐵,你說的沒錯,可能這是官方的bug吧,我首先debug了
發(fā)現(xiàn)走的是MapWrapper.class中的代碼:
直接返回的就是true,而debug以下代碼的時候:
發(fā)現(xiàn)走的是BeanWrapper.class中的代碼:
所以添加
和
他們走的判斷路徑都不一樣
2020-03-23
你的實體類上的注解是不是沒有
你如果就是insert肯定沒用啊?