仅在创建期间生成数据 class 属性值

Generate data class attribute value only during creation

我的模型中定义了一个数据 class Supplier

data class Supplier (
        val id: Int = 0,
        val name: String,
        val owner: String,
) {
    companion object {
        private const val prefix = "SUP"

        private fun generateId(): String {
            return prefix + UUID.randomUUID().toString()
        }
    }

    val supplierId = generateId()
}

我有一个生成的 supplierId 来为每个创建的供应商生成一个新的标识符。

一旦我创建了一个新的 Supplier 并保存到数据库,supplierId 就被存储了。


问题是当我想根据用户提供的 ID 查询供应商对象时。查询功能的Dao实现:

@SqlQuery("select $SUPPLIER_COLS from $TABLE_NAME where supplier_id = :supplier_id")
fun getSupplier(@Bind("supplier_id") supplierId: String): Supplier?

此函数从数据库中获取正确的行,但是当它 returns 通过再次生成一个对象时,会生成一个新的 supplierId 作为它的一部分。


如何修改我的实现,使生成器只在第一次工作而不是在从数据库读取时工作。

我能想到的一种方法是在创建对象之前生成 id 并将其作为参数传递。这样做意味着我的 class 签名不会立即告诉我什么是生成的字段,什么不是。我可以采取其他方法吗?

由于 supplierId 不是构造函数参数,因此 DAO 实现不知道如何设置该值。可能是通过调用构造函数来创建对象。创建新对象时,会生成一个新的 supplierId

要么必须添加 supplierId 作为构造函数参数,要么在创建对象后设置值。因为你已经知道supplierId属于这个对象,所以你可以在DAO返回对象后赋值。

尝试将 supplierId 作为具有默认值的构造函数参数,如下所示:

data class Supplier(
    val supplierId: String = generateId(),
    val id: Int = 0,
    val name: String,
    val owner: String
) {
    companion object {
        private const val prefix = "SUP"

        private fun generateId(): String {
            return prefix + UUID.randomUUID().toString()
        }
    }
}

如果您使用的是 jdbi/kotlin RowMapper,则无需额外更改即可使用。