科尔达州的独特身份

时间:2018-08-27 06:38:43

标签: corda

我想在数据库中创建具有唯一ID的State。有我的州代码

data class SampleState(
    val partyA: Party,
    val partyB: Party,
    val value: Int,
    val id: String,
    override val linearId: UniqueIdentifier = UniqueIdentifier(id),
    val properties: LCProperties = LCProperties("ABC"))    : LinearState {...}

当我提交两个相似的SampleState时,数据库中有两个不同的State,具有两个不同的linearId。因此,有谁可以说说如何确保数据库中SampleState对象的“ id”是唯一的? 我在Flows和Contracts中使用了相同的代码来捕获这种情况,例如

  val results = builder {

        val quantityIndex = SampleSchemaV1.PersistentSample::id.equal(id);

        val customCriteria1 = QueryCriteria.VaultCustomQueryCriteria(quantityIndex)

        val criteria = generalCriteria.and(customCriteria1);

        serviceHub.vaultService.queryBy<SampleState>(criteria)
    }
    if(results.states.count() > 0)
        throw IllegalArgumentException("id $id is exist")

但是,它几乎无法在相似的时间内处理两次提交采样状态事务(即使在1秒内也是如此)(提交事务1,在1秒后提交事务2)

1 个答案:

答案 0 :(得分:0)

在您的州代码中,此行是

override val linearId: UniqueIdentifier = UniqueIdentifier(id)

为您创建一个唯一的ID。您要传递给UniqueIdentifier的 id 会将生成的唯一ID绑定到您的 id 。但是,所有相等和比较都仅基于唯一ID。

看看源代码中的UniqueIdentifier.kt,您将看到这是基础代码:

data class UniqueIdentifier(val externalId: String? = null, val id: UUID = UUID.randomUUID()) : Comparable<UniqueIdentifier> {
    override fun toString(): String = if (externalId != null) "${externalId}_$id" else id.toString()

This是关于Java的randomUUID在确保ID唯一性方面有多出色的好帖子

您还可以了解有关UniqueIdentifier here

的更多信息