hibernate - 使用超类类型休眠 oneToOne
问题描述
我想我想要一个 1to1 的关系,但我的 dB 技能不是最好的。我有一个包含所有弹簧安全逻辑的用户类。我的用户可以是管理员或查看者。
我最初的想法是拥有一个 Profile 超类,然后拥有一个扩展 Profile 的 Admin 和 Viewer 类。
然后我可以给我的用户一个配置文件参数。但是我所有的尝试都失败了......
我认为我的策略是错误的。
我能够获得以下工作 包 com.legge.worksiteWebCams.models.profile
导入 com.legge.worksiteWebCams.models.abstract.RestModel 导入 javax.persistence.*
超类:
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
abstract class Profile : RestModel() {
private val name: String? = null
}
查看器
@Entity
@PrimaryKeyJoinColumn(name = "viewer_id")
class Viewer : Profile() {
//Viewer logic here
}
查看器
@Entity
@PrimaryKeyJoinColumn(name = "admin_id")
class Admin : Profile() {
//Admin logic here
}
然后我能够在 用户中引用它
@Entity
@Table(name = "sec_user", uniqueConstraints = [(UniqueConstraint(columnNames = arrayOf("username"))), (UniqueConstraint(columnNames = arrayOf("email")))])
data class User(
@OneToOne(fetch = FetchType.EAGER, cascade = [(CascadeType.ALL)])
var profile: Profile? = null,
){}
解决方案
我认为你应该使用@OneToMany 关系因为用户可能有很多角色,就像管理员和查看者一样。这是第一种方法。
在 User.java 类中
@OneToMany
List<Role> rol = new ArrayList<>().
2) 做@ManyToMany 映射,因为一个用户有多个角色,一个角色属于多个用户。
用户.java 类。
@ManyToMany(
fetch = FetchType.EAGER,
cascade = CascadeType.ALL)
@JoinTable(
name = "UserRole",
joinColumns = @JoinColumn(
name = "accountId",
referencedColumnName = "id") ,
inverseJoinColumns = @JoinColumn(
name = "roleId",
referencedColumnName = "id") )
private Set<Role> roles;
推荐阅读
- curl - cURL 下载网页数据,而不是文件
- azure - Azure Pipeline 无法与身份验证后的应用服务通信?
- c# - C# VSTO,从剪贴板编辑文本而不丢失格式
- php - 如何更改单个产品页面oceanwp中的评论标题文本
- android - 每当我在颤动中打开它时,如何将我的数据保存在屏幕上
- php - 如何更改 Laravel 日期格式
- php - 如何使用 ajax 向 Telegram 发送消息
- react-native - 无法读取未定义的属性“样式”;使用 rn-sliding-up-panel 时出错
- flutter - 如何每两周(14 天)和每月(每月同一天)循环我的活动?
- database - 联结表中具有唯一值的多对多关系