Как установить каскадный тип для отношения "один ко многим" в Kotlin Exposed?

У меня есть две сущности в отношении "один ко многим". Сущность «Один» владеет жизненным циклом «Многих». Если объект «Один» удален, я хочу, чтобы все объекты «Многие», принадлежащие к «Одному», были удалены автоматически.

Я предполагаю, что есть способ установить ссылку как «CascadeType.DELETE», как в Hibernate, поэтому мне не нужно удалять все «Many» перед удалением «One».

object Apis : IntIdTable() {
    val name = varchar("name", 20)
    val url = varchar("url", 255)
    val method = enumerationByName("method", 20, HttpMethod::class)
    val requestBody = varchar("request_body", 65535)
    val responseDsl = varchar("response_dsl", 65535)
    val responseType = enumerationByName("response_type", 20, ResponseType::class)
    val enabled = bool("enabled")
}

class Api(id: EntityID<Int>) : IntEntity(id){
    companion object : IntEntityClass<Api>(Apis)

    var name by Apis.name
    var url by Apis.url
    var method by Apis.method
    var requestBody by Apis.requestBody
    var responseDsl by Apis.responseDsl
    var responseType by Apis.responseType
    var enabled by Apis.enabled
    val headers by ApiHeader referrersOn ApiHeaders.id
}

object ApiHeaders : IdTable<Int>() {
    override val id = reference("api_id", Apis).primaryKey()
    val key = varchar("key", 255)
    val value = varchar("value", 255)
}

class ApiHeader(id: EntityID<Int>) : Entity<Int>(id) {
    companion object : EntityClass<Int, ApiHeader>(ApiHeaders)

    var api by Api referencedOn ApiHeaders.id
    var key by ApiHeaders.key
    var value by ApiHeaders.value
}

fun main() {
    transaction {
        addLogger(StdOutSqlLogger)
        val api = Api.findById(1)
        // if headers are not deleted, api can't be deleted directly
        api?.headers?.forEach { it.delete() }
        api?.delete()
        commit()
    }
}

Мне нужен способ легко установить желаемый каскадный тип отношений.


person zt1106    schedule 03.05.2019    source источник


Ответы (1)


Функции reference() и optReference() имеют необязательные параметры: onUpdate и onDelete.

В вашем случае вы должны написать:

object ApiHeaders : IdTable<Int>() {
    override val id = reference("api_id", Apis, onDelete = ReferenceOption.CASCADE).primaryKey()
    val key = varchar("key", 255)
    val value = varchar("value", 255)
}
person Tapac    schedule 04.05.2019
comment
Большое спасибо! - person Dennis Anderson; 06.12.2019