跳至主要內容

自定义主键

xuejmnet大约 2 分钟

easy-query提供了PrimaryKeyGenerator接口该接口可以由用户自行实现,具体功能就是可以自动对当前对象的主键进行赋值,比如你可以实现一个uuid的或者雪花id的 2.0.43^

PrimaryKeyGenerator

方法参数描述
getPrimaryKey用来返回一个主键
setPrimaryKey对象,key的columnMetadata用来对对象进行设置主键(默认已经实现一个通用方法)

执行顺序在insert的方法调用executeRows后将先执行对象的PrimaryKeyGenerator.setPrimaryKey然后执行拦截器,所以如果您不需要可以在拦截器里面对其进行从新设置或者清空

如何使用

  • 当前对象必须是数据库对象@Table
  • 当前属性必须是主键@Column(primaryKet=true)
  • 当前属性不可以是生成列@Column(generateKey=true)不可以generateKey=true
  • 当前属性添加@Column(primaryKet=true,primaryKeyGenerator=UUIDPrimaryKeyGenerator.class)
  • 如果有多主键那么也是一样的用法

UUIDPrimaryKeyGenerator

如何实现一个UUID的主键生成器

@Component //如果您是springboot
public class UUIDPrimaryKeyGenerator implements PrimaryKeyGenerator {
    @Override
    public Serializable getPrimaryKey() {
        return UUID.randomUUID().toString().replaceAll("-","");
    }
//    /**
//     * 如果需要判断之前是否有值
//     * @param entity
//     * @param columnMetadata
//     */
//    @Override
//    public void setPrimaryKey(Object entity, ColumnMetadata columnMetadata) {
//        Serializable primaryKey = getPrimaryKey();
//        Object oldValue = columnMetadata.getGetterCaller().apply(entity);
//        if(oldValue!=null)
//        {
//            columnMetadata.getSetterCaller().call(entity, primaryKey);
//        }
//    }
}

@Data
@Table("t_test")
public class UUIDPrimaryKey {
    @Column(primaryKey = true,primaryKeyGenerator = UUIDPrimaryKeyGenerator.class)
    private String id;
}

雪花id

//初始化
Snowflake snowflake = IdUtil.createSnowflake(workerId,dataCenterId)

@Component //如果您是springboot
public class SnowflakePrimaryKeyGenerator implements PrimaryKeyGenerator {
    @Override
    public Serializable getPrimaryKey() {
        return String.valueOf(snowflake.nextId());//因为long类型在js中会出现精度丢失
    }
//    /**
//     * 如果需要判断之前是否有值
//     * @param entity
//     * @param columnMetadata
//     */
//    @Override
//    public void setPrimaryKey(Object entity, ColumnMetadata columnMetadata) {
//        Serializable primaryKey = getPrimaryKey();
//        Object oldValue = columnMetadata.getGetterCaller().apply(entity);
//        if(oldValue!=null)
//        {
//            columnMetadata.getSetterCaller().call(entity, primaryKey);
//        }
//    }
}

@Data
@Table("t_test")
public class SnowflakePrimaryKey {
    @Column(primaryKey = true,primaryKeyGenerator = SnowflakePrimaryKeyGenerator.class)
    private String id;
}

相关搜索

自定义主键 雪花id 自定义id

上次编辑于:
贡献者: Hoysing