@TableId(type = IdType.AUTO)与@TableId(type = IdType.INPUT)的区别
时间: 2024-06-16 12:07:51 浏览: 127
@TableId(type = IdType.AUTO)和@TableId(type = IdType.INPUT)都是MyBatis-Plus框架中用来注解主键id的注解,它们的区别在于主键id的生成方式不同。
@TableId(type = IdType.AUTO)表示主键id自增长,由数据库自动生成。例如,MySQL中的AUTO_INCREMENT。在这种情况下,我们不需要手动指定主键id的值,只需要将该字段声明为@TableId(type = IdType.AUTO)即可。
@TableId(type = IdType.INPUT)表示需要手动输入主键id的值。例如,在向数据库插入一条记录时,需要我们手动输入该记录的主键id。在这种情况下,我们需要手动指定主键id的值,并将该字段声明为@TableId(type = IdType.INPUT)。
相关问题
@Data public class StorageLocationVo extends StorageLocation { @ApiModelProperty(value = "货架名") private String shelfName; private String type; private Integer sectionNum; private Integer layerNum; } @Data @EqualsAndHashCode(callSuper = false) @Accessors(chain = true) @TableName("t_storage_location") @ApiModel(value="StorageLocation对象", description="储位表") public class StorageLocation implements Serializable { private static final long serialVersionUID = 1L; @ApiModelProperty(value = "ID") @TableId(value = "id", type = IdType.AUTO) private Long id; @ApiModelProperty(value = "储位名称") private String name; @ApiModelProperty(value = "储位编码") private String code; @ApiModelProperty(value = "库房id") private Long storeroomId; @ApiModelProperty(value = "站点id") private Long siteId; @ApiModelProperty(value = "识别编码") private String identifyCode; @ApiModelProperty(value = "货架id") private Long shelfId; @ApiModelProperty(value = "是否删除 0:正常 1:删除") @TableLogic private String isDelete; @ApiModelProperty(value = "创建时间") @TableField(fill = FieldFill.INSERT) private Date createTime; @ApiModelProperty(value = "更新时间") @TableField(fill = FieldFill.UPDATE) private Date updateTime; @ApiModelProperty(value = "所属站点名称") @TableField(exist = false) private String siteName; @ApiModelProperty(value = "所属库房名称") @TableField(exist = false) private String storeroomName; @ApiModelProperty(value = "所属货架名称") @TableField(exist = false) private String shelfName; @ApiModelProperty(value = "所属货架编码类型") @TableField(exist = false) private String codeRule; @ApiModelProperty(value = "所属货架节数") @TableField(exist = false) private Integer sectionNum; @ApiModelProperty(value = "所属货架层数") @TableField(exist = false) private Integer layerNum; } 分析一下为什么报java: com.tuimi.gwznkf.storage.entity.vo.StorageLocationVo中的setShelfName(java.lang.String)无法覆盖com.tuimi.gwznkf.storage.entity.StorageLocation中的setShelfName(java.lang.String) 返回类型void与com.tuimi.gwznkf.storage.entity.StorageLocation不兼容 问题解决
这个问题是由于在子类StorageLocationVo中定义了一个与父类StorageLocation中同名的属性shelfName,并且使用了@Data注解,自动生成了一个setShelfName方法,但是返回类型不同导致的。
解决该问题有两种方法:
1. 删除子类StorageLocationVo中的属性shelfName,因为父类中已经定义了该属性,所以不需要在子类中再定义一次。
2. 在子类StorageLocationVo中重新定义setShelfName方法,并且保证方法签名(包括返回类型、方法名和参数列表)与父类中的方法一致。可以使用@Override注解来表示该方法是对父类方法的重写。例如:
```
@Override
public void setShelfName(String shelfName) {
super.setShelfName(shelfName);
// 子类自定义的操作
}
```
需要注意的是,在子类中重写父类方法时,应该先调用父类的方法,再进行子类自己的操作,以保证方法的正确性。
@TableId(type = IdType.INPUT)
`@TableId(type = IdType.INPUT)` 是 Mybatis-Plus 框架提供的注解之一,用于标注实体类中主键字段对应的属性。其中,`type` 参数表示主键生成策略,`IdType.INPUT` 表示主键值由应用程序手动赋值,而不是由数据库自动生成。
举个例子,假设有如下实体类:
```java
public class User {
@TableId(type = IdType.INPUT)
private Long id;
private String name;
private Integer age;
// getter/setter 略
}
```
在这个实体类中,`@TableId(type = IdType.INPUT)` 标注在 `id` 字段上,表示该字段是主键字段,且主键值由应用程序手动赋值。在插入新的 User 记录时,需要手动设置 id 字段的值,如:
```java
User user = new User();
user.setId(1L);
user.setName("张三");
user.setAge(18);
userMapper.insert(user);
```
注意,如果在插入记录时没有设置 id 字段的值,且数据库中已经存在相同 id 值的记录,会导致插入失败。因此,在使用 `@TableId(type = IdType.INPUT)` 时,需要特别小心,确保主键值的唯一性。
阅读全文