Уникальная идентификация штата в Корде - PullRequest
0 голосов
/ 27 августа 2018

Я хочу создать 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, в базе данных появляются два разных состояния с двумя разными linearId.Итак, есть кто-нибудь, кто может сказать мне, что, как убедиться, что «идентификатор» объекта SampleState в базе данных является уникальным?Я использовал один и тот же код для перехвата этого случая в потоках и контрактах, например

  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")

. Однако он не работает с двумя транзакциями Sample State commit почти в одно и то же время, даже в 1 с (фиксация транзакции 1 и после1 секунда, совершить транзакцию 2)

1 Ответ

0 голосов
/ 29 августа 2018

В вашем коде состояния именно эта строка:

override val linearId: UniqueIdentifier = UniqueIdentifier(id)

, которая создает уникальный идентификатор для вас. id , который вы передаете в UniqueIdentifier, связывает уникальный идентификатор, сгенерированный с вашим 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()

Этот является хорошим постом о том, насколько хорош Java randomUUID в обеспечении уникальности идентификатора

Вы также можете прочитать больше об UniqueIdentifier здесь

...