mybatis-mapper / mapper

MyBatis Mapper
https://mapper.mybatis.io
Apache License 2.0
325 stars 47 forks source link

升级2.0.0之后,如何排除实体类 继承的父类的 映射 #56

Closed yao00jun closed 1 year ago

yao00jun commented 1 year ago

我有一个实体类User,继承的父类BaseVO,例如,User表结构 有字段 A 、B 实体类User有属性A、B 父类BaseVO 有属性C,D, 升级2.0.0之后,会报错说 数据库User表找不到对应的属性C和D。 请问,如何排除 父类的 映射? 以前1.2.2版本 没有问题。

yao00jun commented 1 year ago

找到个 @Entity.Transient 注解 ,但是只能排除字段,不能排除整个父类。。。因为父类是公司框架封装好的,无法修改。

abel533 commented 1 year ago

继承排除字段是个问题,先别升级。。等出个方案兼容这种情况。

你有好的想法吗?

drtrang commented 1 year ago

抛出一种方式,大家共同讨论。

方案:实体类中主动声明表中的字段,而不是排除,再通过多种形式扩展生效范围 举例:

  1. @Column 可声明在 field 上,适用于大多数场景
  2. @Column 可声明在 getter/setter 方法上,适用于继承父类的场景,可重写 getter/setter 实现添加 @Column 注解
  3. @Columns 可声明在 class 上,适用于全部场景,一次性声明全部的列名

该 idea 来源于 Jackson,分别对应 @JsonProperty、@JsonProperties

abel533 commented 1 year ago

@drtrang 这是最常见的方式,目前 @ydq 可能在尝试双向绑定,读取表结构和实体字段进行绑定。

如果没有更好的方式实现,会按照 @drtrang 这里提供的方式实现。

abel533 commented 1 year ago

注解增加3个属性用于排除字段:

https://github.com/mybatis-mapper/provider/commit/6e46c24e0d96b56502ff96fc8230a760e8027328

@Entity.Table(value = "user",
    excludeSuperClasses = Role.class,
    excludeFieldTypes = User1.class,
    excludeFields = "age")
public class UserExclude extends Role {
  @Entity.Column(id = true, useGeneratedKeys = true)
  private Long   id;
  @Entity.Column("name")
  private String username;

  private User1 user1;

  private int age;