Как проверить уникальность в сочетании с Xodus DNQ - PullRequest
0 голосов
/ 06 марта 2020

У меня есть две сущности; municipality и city. Предполагается, что муниципалитеты имеют уникальные названия, в то время как города считаются уникальными в пределах своего муниципалитета .

Есть ли способ установить ограничение для городов так, чтобы сочетание их названия и его Название муниципалитета должно быть уникальным?


Объекты

class XdCity(entity: Entity) : XdEntity(entity) {
    companion object : XdNaturalEntityType<XdCity>()

    var name by xdRequiredStringProp()
    var municipality: XdMunicipality by xdLink1(
        XdMunicipality::cities,
        onDelete = OnDeletePolicy.CLEAR,
        onTargetDelete = OnDeletePolicy.CASCADE
    )
}
class XdMunicipality(entity: Entity) : XdEntity(entity) {
    companion object : XdNaturalEntityType<XdMunicipality>()

    var name by xdRequiredStringProp(unique = true)
    val cities by xdLink1_N(
        XdCity::municipality,
        onDelete = OnDeletePolicy.CASCADE,
        onTargetDelete = OnDeletePolicy.CLEAR
    )
}

Контрольный пример

@Test
fun testAddSameCityName() {
    Database.store.transactional {
        val municipality = XdMunicipality.new("Mun 1")
        val city = XdCity.new("City")
        city.municipality = municipality
    }

    // Allow insertion of same city name in other municipality
    Database.store.transactional {
        val municipality = XdMunicipality.new("Mun 2")
        val city = XdCity.new("City")
        city.municipality = municipality
    }

    // Do not allow insertion of existing city name in municipality
    assertFailsWith<ConstraintsValidationException> {
        Database.store.transactional {
            val municipality = XdMunicipality.find("Mun 1")
            val city = XdCity.new("City")
            city.municipality = municipality
        }
    }
}

1 Ответ

1 голос
/ 06 марта 2020

Рекомендуемый подход заключается в использовании xdParent и xdChildren отношений между XdCity и XdMunicipality.

Может быть не так легко изменить отношение, когда база данных имеет историю. Чтобы решить проблему с уникальными именами в области муниципалитета, вы можете использовать составные индексы для типов сущностей, как здесь:

        companion object : XdNaturalEntityType<XdCity>() {
            override val compositeIndices = listOf(
                    listOf(XdCity:: municipality, ...may goes anything like XdCity::name)
            )
        }
...