我试图使用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"
}
}
答案 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