我想在数据库中创建具有唯一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)
答案 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
的更多信息