/** * 更新时间 */ @field:UpdateTimestamp @Column(name = "update_dt", nullable = false) var updateDt: Date = Date()
/** * 逻辑删除标记 */ var deleted: Boolean = false
/** * 乐观锁版本号 */ @Version var version: Long = 0 }
@Entity @Table(name = "user") dataclassUser( var username: String, val password: String, val nickname: String, val mobile: String, val status: Int ) : BaseEntity()
// 创建时前端传过来的数据类 dataclassUserCreateRequestModel( val username: String, val password: String, val nickname: String, val mobile: String, val version: Int ) // 修改时前端传过来的数据类 dataclassUserUpdateRequestModel( val username: String, val nickname: String, val mobile: String )
// 最终版 inlinefun<reified T: Any>new(source: Any? = null): T { val obj = T::class.java.getDeclaredConstructor().newInstance() if (source == null) { return obj } return obj.merge(source) }
inlineinfixfun<reified T : Any, reified S : Any> T.merge(source: S): T { val beanInfo = Introspector.getBeanInfo(source.javaClass) val nameToPropertyOfSource = beanInfo.propertyDescriptors.associateBy { it.name } val nameToPropertyOfTarget = T::class.memberProperties.associateBy { it.name }
// 根据目标类的主构造函数创建对象, 不在主构造函数中的var属性在下一步处理, 不在主构造函数中的val属性会略过. val primaryConstructor = T::class.primaryConstructor!! val primaryConstructorParams = mutableListOf<String>() val args = primaryConstructor.parameters.associate { parameter -> val name = parameter.name!! primaryConstructorParams.add(name) val readMethodOfSource = nameToPropertyOfSource[name]?.readMethod val propertyOfTarget = nameToPropertyOfTarget[name] parameter to (readMethodOfSource?.invoke(source) ?: propertyOfTarget?.get(this)) } val obj = primaryConstructor.callBy(args)