公开的 ORM:多对多关系最佳实践中的 DSL 与 DAO

Stu*_*art 4 kotlin kotlin-exposed

我正在建立一些多对多关系,并且到目前为止一直在使用暴露的 DSL 模式(而不是 DAO)。然而,创建多对多关系似乎只能使用 DAO 方法。

我知道交替使用这两种模式可能没问题,但是当我设置项目并继续前进时,我想知道从代码质量的角度来看最好的方法是什么。两者都使用还是切换到 DAO?或者第三种选择是,这个问题代表了对 Kotlin 和/或 Exposed (两者都是新的)的误导性理解,在这种情况下,我哪里出错了?提前致谢

Ted*_*ide 5

可以使用 DSL 为表创建多对多关系。然而,是否应该使用 DSL 或 DAO 或两者一起使用实际上取决于您以及它是否使代码更容易或更难阅读和维护。

下面是与 DSL 的多对多关系的基本示例。

import org.jetbrains.exposed.dao.id.IntIdTable
import org.jetbrains.exposed.sql.*
import org.jetbrains.exposed.sql.transactions.transaction

object Users : IntIdTable() {
    val username = varchar("username", 50)
}

object Permissions : IntIdTable() {
    val name = varchar("name", 50)
}

object UserPermissionsJunctionTable : IntIdTable() {
    val user = reference("user", Users)
    val permission = reference("permission", Permissions)
}

fun main(args: Array<String>) {
    val db = Database.connect("jdbc:sqlite:test.db", "org.sqlite.JDBC")

    transaction {
        addLogger(StdOutSqlLogger)

        SchemaUtils.create(Users, Permissions, UserPermissionsJunctionTable)

        val userId = Users.insertAndGetId {
            it[username] = "john.smith"
        }

        val readPermissionId = Permissions.insertAndGetId {
            it[name] = "read"
        }

        val writePermissionId = Permissions.insertAndGetId {
            it[name] = "write"
        }

        UserPermissionsJunctionTable.insert {
            it[user] = userId
            it[permission] = readPermissionId
        }

        UserPermissionsJunctionTable.insert {
            it[user] = userId
            it[permission] = writePermissionId
        }

        val result = Users
            .join(UserPermissionsJunctionTable, JoinType.INNER, additionalConstraint = {
                Users.id eq UserPermissionsJunctionTable.user
        })
            .join(Permissions, JoinType.INNER, additionalConstraint = {
                UserPermissionsJunctionTable.permission eq Permissions.id
        })
            .slice(Users.username, Permissions.name).selectAll().map {
                it[Users.username] to it[Permissions.name]
        }

        println(result)
    }
}
Run Code Online (Sandbox Code Playgroud)

这打印[(john.smith, read), (john.smith, write)]