关于mybatisplus的一个实体类Id类型映射错误

问题复现:

错误日志显示在一个类的第160行报错了,错误是Id字段的值1871748053496823810超过了int类型的最大值

错误日志.png

我们继续来看报错所在160行,这里就是一个简单的lambdaQuery,根据uid,及subUid查询是否存在,不存在新增,存在就增加奖励。


image.png

实体类代码如下

@AllArgsConstructor
@NoArgsConstructor
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("team_reward")
public class TeamReward  extends BaseEntity {

    /**
     * 经纪人uid
     */
    private Integer uid;

    /**
     * 下级uid
     */
    private Integer subUid;
...
}


@Data
public class BaseEntity {

    /**
     * 主键id
     */
    @TableId(value = "id", type = IdType.ASSIGN_ID)
    private Long id;

    /**
     * 创建人
     */
    @TableField(fill = FieldFill.INSERT, value = "create_by")
    private String createBy;

    /**
     * 修改人
     */
    @TableField(fill = FieldFill.INSERT_UPDATE, value = "update_by")
    private String updateBy;

    /**
     * 创建时间
     */
    @TableField(fill = FieldFill.INSERT, value = "create_time")
    private Long createTime;

    /**
     * 修改时间
     */
    @TableField(fill = FieldFill.INSERT_UPDATE, value = "update_time")
    private Long updateTime;
}

实体表

CREATE TABLE `team_reward` (
  `id` bigint(21) NOT NULL COMMENT 'id',
  `uid` int(11) NOT NULL COMMENT 'uid',
  `sub_uid` int(11) NOT NULL COMMENT 'subuid',
    ...
  `create_by` varchar(255) NOT NULL COMMENT '创建人',
  `create_time` bigint(20) NOT NULL COMMENT '创建时间',
  `update_by` varchar(255) NOT NULL COMMENT '最后修改人',
  `update_time` bigint(20) NOT NULL COMMENT '更新时间',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ;

问题分析

  • @TableId 注解问题:虽然你的 id 在 Java 类中定义为 Long 类型,但如果数据库中 id 列的类型是 BIGINT,MyBatis 的类型映射可能会出现问题。
  • MySQL JDBC 驱动默认行为:MySQL 的 JDBC 驱动在映射 BIGINT 类型时,可能会错误地尝试映射为 Integer。
  • MyBatis 或 MyBatis-Plus 配置问题:MyBatis 映射器中,若没有正确指定 id 的类型,可能导致 JDBC 驱动错误地解析为 Integer。

问题解决

经过检查,

  • 数据库表Id确定为bigint(20)没问题
  • 数据库映射实体类Id为Long 没问题
    怀疑是实体类继承BaseEntity映射数据库时有问题,故将BaseEntity类的属性直接放入到实体中,问题解决。

import java.math.BigDecimal;
import com.baomidou.mybatisplus.annotation.*;
import java.io.Serializable;
import java.time.LocalDate;
import com.sato.mini.common.core.util.DateUtil;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;

/**
 * @author wds
 * @since 2024-11-27
 */
@AllArgsConstructor
@NoArgsConstructor
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("team_reward")
public class TeamReward {


    /**
     * 主键id
     */
    @TableId(value = "id", type = IdType.ASSIGN_ID)
    private Long id;

    /**
     * uid
     */
    private Integer uid;

    /**
     * subUid
     */
    private Integer subUid;

....
    /**
     * 开始时间
     */
    private Long beginTime;

    /**
     * 结束时间
     */
    private Long endTime;

    /**
     * 状态 0-不可用 1-可用
     */
    private Integer status;


    /**
     * 创建人
     */
    @TableField(fill = FieldFill.INSERT, value = "create_by")
    private String createBy;

    /**
     * 修改人
     */
    @TableField(fill = FieldFill.INSERT_UPDATE, value = "update_by")
    private String updateBy;

    /**
     * 创建时间
     */
    @TableField(fill = FieldFill.INSERT, value = "create_time")
    private Long createTime;

    /**
     * 修改时间
     */
    @TableField(fill = FieldFill.INSERT_UPDATE, value = "update_time")
    private Long updateTime;
}

反思一下

数据库表的统一字段放入一个BaseEntity中,所有实体类都继承BaseEntity这是一个很通用的做法,而且其他表也是这样做,第一次出现这个问题。
为什么就单独这个类会出现这个问题?
为什么不使用继承的方式而是直接加入到实体类问题就解决了呢?

猜测可能的原因:
1.MyBatis Plus 映射本身的问题
2.mybatis sqlsession缓存的问题
3.代码有地方被忽略了

待后续有新的进展更新此反思结果

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容