Skip to content

实体对象

和多数 orm 框架一样,sorm 中支持数据库表和实体对象之间的映射关系,且支持在应用启动时,根据java实体对象自动生成数据库表。

TIP

需要在配置中正确配置实体类位置以及开启自动生成数据库表功能。

yaml
sorm:
  settings:
    ddl-auto: create_if_not_exist
    show-sql: true
    entity-packages: cn.piesat.v.sample.sorm.domain.entity
    dev-mode: true

实体类长这样:

java
@Data
@Accessors(chain = true)
@Table
public class Student extends Model<Student> {

    @Id(autoStrategy = IdAutoStrategy.snow_flake)
    private String id;

    private String name;

    private int age;

    private String address;

    private String email;

    private int deleted;

    @Column(definition = "text")
    @TypeHandler(JsonTextTypeHandler.class)
    private Map<String, Object> attributes;

    @Column(updatable = false)
    private LocalDateTime createAt;

    @Column(insertable = false)
    private LocalDateTime updateAt;

}

下面描述每个注解的用法

@Table

标记实体类为数据库表,参数有:

参数说明默认值
name定义数据库表名称空,则自动根据类名生成数据库表名
prefix数据库表名前缀,在name未设置时生效
ds数据源名称 多数据源时有效空 则指派到第一个数据源
comment数据库表注释
uniques设置表唯一性约束,@TableUnique注解定义唯一约束字段集和名称
indexes设置表索引,@TableIndex注解定义索引字段和名称

@Column

标记实体类字段为数据库表字段,参数有:

默认不需要添加此注解,sorm 会根据字段类型自动生成数据库字段类型,但在一些需要对生成的字段更多控制的场景下,可以手动指定。

参数说明默认值
definition明确指定数据库表字段类型,如: varchar(128) bigint(128) int unsigned空,则自动根据字段类型生成数据库字段类型
comment数据库表字段注释
unique是否唯一false
updatable是否可更新true
insertable是否可插入true
nullable是否可空true
fill字段默认填充值 @ColumnFill 定义字段填充值
json是否定义为 json 类型false

@Id

标记实体类字段为数据库表主键,参数有:

参数说明默认值
autoStrategy主键自动生成策略 auto_increment 数据库自增, 字段类型必须是数值类型,- snow_flake: 雪花算法, 字段类型是 long 或 string, none: 需要每次手动设置主键值auto_increment
autoPrefix自动id的前缀,使自动生成的id更有语义,如: 订单表设置id为 order_10002

@TypeHandler

标记某个实体字段使用自定义类型处理器,参数有:

参数说明默认值
value类型处理器类名

如一个处理 pojo 类型的类型处理器:

java
@Data
@Accessors(chain = true)
public class Attribute implements Serializable {

    private String phoneNumber;

    private String major;

    private String height;

    private String weight;

}
java
public class AttributeTypeHandler implements FieldTypeHandler<Attribute> {
    /**
     * 从数据库结果获取实际 entity 字段值
     *
     * @param record
     * @param columnName
     * @return
     */
    @Override
    public Attribute getResult(Record record, String columnName) {
        return GsonUtil.fromJson(record.get(columnName), Attribute.class);
    }

    /**
     * 将 java 实体值正确地设置到数据库对象中
     *
     * @param record     数据库对象
     * @param columnName 数据库列名
     * @param parameter  实体参数
     */
    @Override
    public void setRecord(Record record, String columnName, Attribute parameter) {
        record.set(columnName, GsonUtil.toJsonString(parameter));
    }
}

使用:

java
@Table(ds = "default")
public class Student extends Model<Student> {

    @Id(autoStrategy = IdAutoStrategy.snow_flake)
    private String id;

    private String name;

    private int age;

    private String address;

    private String email;

    @Column(definition = "text") 
    @TypeHandler(AttributeTypeHandler.class) 
    private Attribute attributes;  

}

@Transient

标记某个实体字段不作为数据库字段,不会被持久化。

Released under the MIT License.