公开的 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)]
我正在建立一些多对多关系,到目前为止一直在使用 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)]