dromara / easy-query

java/kotlin high performance lightweight solution for jdbc query,support oltp and olap query,一款java下面支持强类型、轻量级、高性能的ORM,致力于解决jdbc查询,拥有对象模型筛选、隐式子查询、隐式join
http://www.easy-query.com
Apache License 2.0
477 stars 48 forks source link

希望添加一个主键生成接口标准,让用户自主实现接口来返回主键Id #231

Closed chengliang4810 closed 3 weeks ago

chengliang4810 commented 1 month ago

我看到官网案例中的案例是,在Base实体类中设置主键字段,在实体拦截器中转换为Base实体类进行设置值。那么当不继承Base类的情况,就没办法给对象的主键设置主键Id。

xuejmnet commented 1 month ago

@chengliang4810 可以通过以下方式来实现

public interface HasId{
     String getId();
     void setId(String id);
}

@Data
public class MyUser implements HasId{
      private String id;
}

拦截器判断

 @Override
    public boolean apply(Class<?> entityClass) {
        return HasId.class.isAssignableFrom(entityClass);
    }

当然这只是一种手段你也可以使用注解模式

@Data
@HasIdAnnotation
public class MyUser{
      private String id;
}

    @Override
    public void configureInsert(Class<?> entityClass, EntityInsertExpressionBuilder entityInsertExpressionBuilder, Object entity) {

        EntityMetadata entityMetadata = entityInsertExpressionBuilder.getRuntimeContext().getEntityMetadataManager().getEntityMetadata(entityClass);

        String singleKey = entityMetadata.getSingleKeyProperty();//multi keys will throw exception
        ColumnMetadata columnOrNull = entityMetadata.getColumnOrNull(singleKey);
        if(columnOrNull!=null){
            Object idValue=columnOrNull.getGetterCaller().apply(entity);
            if(idValue==null){
                columnOrNull.getSetterCaller().call(entity,"我的id");
            }
        }        

//        EntityMetadata entityMetadata = entityInsertExpressionBuilder.getRuntimeContext().getEntityMetadataManager().getEntityMetadata(entityClass);
//
//        Collection<String> keyProperties = entityMetadata.getKeyProperties();
//        if(EasyCollectionUtil.isSingle(keyProperties)){
//            String singleKey = EasyCollectionUtil.first(keyProperties);
//            ColumnMetadata columnOrNull = entityMetadata.getColumnOrNull(singleKey);
//            if(columnOrNull!=null){
//                Object idValue=columnOrNull.getGetterCaller().apply(entity);
//                if(idValue==null){
//                    columnOrNull.getSetterCaller().call(entity,"我的id");
//                }
//            }
//        }
        //apply处判断是否有注解HasIdAnnotation
    }
xuejmnet commented 1 month ago

我只是给出了一种模式您如果想要其他的可以自行实现毕竟我也不知道你要什么id或者说id本来就是跟着业务走的而不是框架提供的如果我提供了雪花id那么可能使用雪花id的人很方便但是如果您使用变种的雪花id那么我是否又要增加一个呢

chengliang4810 commented 1 month ago

我只是给出了一种模式您如果想要其他的可以自行实现毕竟我也不知道你要什么id或者说id本来就是跟着业务走的而不是框架提供的如果我提供了雪花id那么可能使用雪花id的人很方便但是如果您使用变种的雪花id那么我是否又要增加一个呢

如果由您来实现每一种生成方式肯定不合适,比较理想的方案应该是您来定个标准接口即可,例如下方代码

public interface PrimaryKeyGenerator {
        Serializable getPrimaryKey();
}

您的程序中只需要调用该接口的实例来获取结果即可,当然在这个标准接口下您可以增加一些常用的Id生成策略,比如雪花ID、UUId之类的。

xuejmnet commented 1 month ago

非常棒的一个想法

xuejmnet commented 4 weeks ago
image image image

赋值会在interceptor之前进行,如果有不需要赋值的可以自行在拦截器里面取消掉 版本2.0.36+

xuejmnet commented 4 weeks ago

@chengliang4810 http://www.easy-query.com/easy-query-doc/guide/adv/auto-key.html