如何用Kotlin Exposed通过关联表实现User与Role的一对一映射?
用Kotlin Exposed通过关联表实现User与Role的一对一映射
1. 先给关联表加唯一约束(保证一对一)
首先确保关联表UserAuthorityTable里的userId是唯一的,从表结构层面限制一个用户只能对应一个角色:
object UserAuthorityTable : Table("user_authority") { val userId = reference("user_id", UserTable).uniqueIndex() // 唯一索引确保一个用户仅关联一个角色 val roleId = reference("role_id", RoleTable) override val primaryKey = PrimaryKey(userId, roleId) }
2. 修改User实体的role属性映射
在User实体中,不要用hasMany,而是用hasOne结合关联表来直接关联单个Role实例,通过via方法指定关联关系的中间表:
class User(id: EntityID<Long>) : Entity<Long>(id) { companion object : EntityClass<Long, User>(UserTable) var username by UserTable.username var password by UserTable.password // 直接映射为单个Role实例,而非集合 val role by Role referencedOn UserAuthorityTable.roleId via UserAuthorityTable.userId } class Role(id: EntityID<Long>) : Entity<Long>(id) { companion object : EntityClass<Long, Role>(RoleTable) var name by RoleTable.name var description by RoleTable.description }
3. 查询使用示例
现在查询User时,user.role会直接返回单个Role?类型的实例(无角色时为null),无需再从集合中取第一个元素:
val targetUser = User.findById(1L) val userRole = targetUser?.role // 直接获取单个Role实例
4. 为未来扩展留余地
如果后续需要改成一对多关系,只需要两步改动:
- 去掉
UserAuthorityTable中userId的uniqueIndex()约束 - 将User实体的
role属性改为roles,用hasMany关联:
val roles by Role via UserAuthorityTable
内容的提问来源于stack exchange,提问作者Amit Sharma
相关产品推荐
相关产品推荐

