问题复现:
错误日志显示在一个类的第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.代码有地方被忽略了
待后续有新的进展更新此反思结果