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

Exposed ORM: DSL vs DAO in Many-to many relationships best practices

我正在建立一些多对多关系,到目前为止一直在使用 Exposed DSL 模式(与 DAO 相对)。但是,创建多对多关系似乎只能使用 DAO 方法。

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

可以使用 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)
    }
}

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