@TableFiled(exist=false)和@Transient有什么区别
时间: 2024-05-17 15:19:25 浏览: 66
@TableFiled(exist=false)是Mybatis-Plus中的注解,用于标注实体类中的属性,表示该属性不是数据库表中的字段。而@Transient是JPA中的注解,也用于标注实体类中的属性,表示该属性不需要被持久化到数据库中。
它们的区别在于作用范围不同。@TableFiled(exist=false)只对Mybatis-Plus的ORM框架起作用,表示该属性不需要与数据库字段进行映射;而@Transient对所有的ORM框架都起作用,表示该属性不需要被持久化到数据库中,无论是Mybatis-Plus还是其他ORM框架都可以使用。
此外,@TableFiled(exist=false)还可以配合Mybatis-Plus的自动填充功能使用,用于在插入或更新数据时自动填充某些字段的值。而@Transient则没有这样的功能。
相关问题
@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);
// 子类自定义的操作
}
```
需要注意的是,在子类中重写父类方法时,应该先调用父类的方法,再进行子类自己的操作,以保证方法的正确性。
@TableField(exist = false)的作用是什么
@TableField(exist = false) 是 MyBatis-Plus 框架中的注解,它的作用是指示 MyBatis-Plus 在进行数据库映射时,忽略该字段。
通常情况下,MyBatis-Plus 会根据实体类的字段与数据库表的列名进行映射。但有时候我们希望实体类中的某个字段不参与数据库映射,比如计算字段或者临时字段,这时就可以使用 @TableField(exist = false) 注解来标记该字段。
使用 @TableField(exist = false) 注解后,MyBatis-Plus 在进行数据库操作时会忽略该字段,不会参与到 SQL 语句的生成和执行过程中。这样可以避免不必要的数据库操作,提高性能。
需要注意的是,@TableField(exist = false) 注解只对该字段的数据库映射起作用,对于其他操作(如新增、更新、查询等)仍然可以正常使用该字段。
阅读全文