思考实体类对象中的主键id一直有值,但到执行insertOrUpdate方法时一直走insert而不走update
- 一开始以为实体类没有实现Serializable序列化接口导致insertOrUpdate执行的时候走了insert方法,然后查看了实体类发现继承了mybatisplus的Model类,Model类实现了Serializable接口。
//实体类
@Data
@TableName("rq_container")
public class Container extends Model {
private static final long serialVersionUID = 1L;
@TableId(value = "id", type = IdType.AUTO)
private Integer id;
}
//Model类
public abstract class Model> implements Serializable {
private static final long serialVersionUID = 1L;
}
解决
最后才意识到是由于设置了逻辑删除字段导致insertOrUpdate执行的时候通过selectById方法没有查询到该条数据(最终执行的是selectOne方法,selectOne会自动将已逻辑删除的数据过滤掉),所以才走了insert方法。
源码如下:
public abstract class Model> implements Serializable { private static final long serialVersionUID = 1L; private final transient Log log = LogFactory.getLog(getClass()); public boolean insertOrUpdate() { return StringUtils.checkValNull(pkVal()) || Objects.isNull(selectById(pkVal())) ? insert() : updateById(); } } public T selectById(Serializable id) { SqlSession sqlSession = sqlSession(); try { return sqlSession.selectOne(sqlStatement(SqlMethod.SELECT_BY_ID), id); } finally { closeSqlSession(sqlSession); } }



