如何使用Exposed

时间:2019-09-11 08:44:31

标签: kotlin orm dsl one-to-one

我试图使用Exposed在两个表之间建立一个OneToOne关系,我创建了一个User表和一个UserSettings表,我想让User表引用UserSettings表。我的问题是如何创建参考并创建具有参考设置的用户?

UserTable

object UserTable : IntIdTable("user") {
    val username = varchar("username", 16)
    val email = varchar("email", 254)
    val password = varchar("password_hash", 60)
    val settings = reference("id", UserSettingsTable)
}

UserEntity

class User(id: EntityID<Int>): IntEntity(id), Principal {

    companion object : IntEntityClass<User>(UserTable)

    var username by UserTable.username
    var email by UserTable.email
    var password by UserTable.password
    val settings by UserSettings referrersOn UserTable.settings
}

SettingsTable

object UserSettingsTable : IntIdTable("user_settings") {
    var themeName = varchar("theme_name", 16).clientDefault {"dark"}
}

SettingsEntity

open class UserSettings(id: EntityID<Int>) : IntEntity(id) {

    companion object : IntEntityClass<UserSettings>(UserSettingsTable)

    var themeName by UserSettingsTable.themeName
}

这就是我试图创建条目的目的

User.new {
    email = "email@gmail.com"
    username = "Someone"
    password = "test"
}.also { newUser ->
    UserSettings.new(newUser.id.value) {
        themeName = "dark"
    }
}

1 个答案:

答案 0 :(得分:1)

这是我未测试过的样品:

Product

请注意,object UserSettingsTable : IntIdTable("user_settings") { var themeName = varchar("theme_name", 16).clientDefault {"dark"} } object UserTable : IntIdTable("user") { val username = varchar("username", 16) val email = varchar("email", 254) val password = varchar("password_hash", 60) val settings = reference("settings", UserSettingsTable) } class UserSettings(id: EntityID<Int>) : IntEntity(id) { companion object : IntEntityClass<UserSettings>(UserSettingsTable) var themeName by UserSettingsTable.themeName } class User(id: EntityID<Int>): IntEntity(id) { companion object : IntEntityClass<User>(UserTable) var username by UserTable.username var email by UserTable.email var password by UserTable.password var settings by UserSettings referencedOn UserTable.settings } fun createUser(): User { return User.new(1) { email = "email@gmail.com" username = "Someone" password = "test" settings = UserSettings.new(1) { themeName = "dark" } } } 是用于简单引用,而referencedOn是用于集合。此外,“已暴露”中有a limitation

  

仅在手动设置id列的情况下,才能在同一事务中创建实体和引用。如果您使用的是UUIDTables和UUIDEntity,则可以这样做:

referrersOn