首页 > 解决方案 > 使用超类类型休眠 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,
){}

标签: hibernatepolymorphism

解决方案


我认为你应该使用@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;

推荐阅读