实体类的主要作用是与数据库的表、字段相对应。一般来说,一个表对应一个实体类(Domain),一个字段对应一个属性。
数据库表结构改变,实体类就要做相应的改变。这部分工作是重复性的,一般由代码生成器代劳。修改表结构后,只要再次执行代码生成器,即可完成实体类(Domain)的改动。
实际开发中经常需要修改实体类,而代码生成器每次都会重新生成整个实体类,会把程序员修改的代码覆盖。为此,将实体类分成两部分,一部分是由代码生成器维护的实体基类ExampleBase
,另一部分则是真正使用的实体类Example
,Example
继承ExampleBase
。需要增加额外代码时,加到Example
中即可。
com.ujcms.cms.ext.domain.base.ExampleBase
public class ExampleBase implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 数据库表名
*/
public static final String TABLE_NAME = "example";
/**
* ID
*/
@NotNull
@Schema(description="ID")
private Integer id = 0;
/**
* 名称
*/
@Length(max = 30)
@Nullable
@Schema(description="名称")
private String name;
/**
* 描述
*/
@Length(max = 150)
@Nullable
@Schema(description="描述")
private String description;
/**
* 身高
*/
@Nullable
@Schema(description="身高")
private Integer height;
/**
* 出生日期
*/
@Nullable
@Schema(description="出生日期")
private OffsetDateTime birthday;
/**
* 是否启用
*/
@NotNull
@Schema(description="是否启用")
private Boolean enabled = true;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
@Nullable
public String getName() {
return name;
}
public void setName(@Nullable String name) {
this.name = name;
}
@Nullable
public String getDescription() {
return description;
}
public void setDescription(@Nullable String description) {
this.description = description;
}
@Nullable
public Integer getHeight() {
return height;
}
public void setHeight(@Nullable Integer height) {
this.height = height;
}
@Nullable
public OffsetDateTime getBirthday() {
return birthday;
}
public void setBirthday(@Nullable OffsetDateTime birthday) {
this.birthday = birthday;
}
public Boolean getEnabled() {
return enabled;
}
public void setEnabled(Boolean enabled) {
this.enabled = enabled;
}
}
不要改动ExampleBase
,该类由代码生成器维护,每次运行代码生成器,这个类都会重新生成,所做的修改会被覆盖。
com.ujcms.cms.ext.domain.Example
public class Example extends ExampleBase implements Serializable {
private static final long serialVersionUID = 1L;
}
需要增加额外代码时,在Example
中增加,不要修改ExampleBase
。
日期类型一律映射成Java8的OffsetDateTime,不使用传统的Date类型。
代码生成时,会根据数据库字段的注释,生成swagger的注解。如:
@Schema(description="名称")
生成器会根据数据库字段是否允许为NULL,以及字符串长度,生成相应的Validation注解。如:
@Length(max = 30)
@Nullable
需注意,如果字符串长度能够同时被3和10整除,会认为用于存储中文。考虑到有些数据库字符长度以字节单位,一个中文最多需要3个字节存储,因此映射时会将最大长度限制除以3。如:
varchar(450) -> @Length(max = 150)
varchar(90) -> @Length(max = 30)
varchar(30) -> @Length(max = 10)
varchar(10) -> @Length(max = 10)
varchar(15) -> @Length(max = 15)
varchar(3) -> @Length(max = 3)
varchar(12) -> @Length(max = 12)
varchar(255) -> @Length(max = 255)