【问题标题】:Spring boot @JoinCulumn ManyToOne relationship column does not existSpring boot @JoinClumn ManyToOne 关系列不存在
【发布时间】:2021-08-17 11:55:42
【问题描述】:

我目前对这种关系有疑问,我已经尝试了我在互联网上看到的所有内容。不过,我收到此错误:错误:列角色0_.user_id 不存在。

我有一个具有 Spring Security 的启动应用程序,我需要使用 PostgreSQL 数据库中的用户登录。

但我就是无法让用户和角色之间的关系发挥作用。

这里是实体类:

 @Data
@Entity
@Table(name="user",schema = "public")
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "user_id")
    private Integer id;
    @Column(unique = true)
    private String username;
    private String password;
    private boolean enabled;
  @OneToMany(mappedBy = "user", fetch = FetchType.EAGER)
  private List<Role> roles;
}

@Data
@Entity
@Table(name="role",schema = "public")
public class Role {

    @Id
    @Column(name="role_id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;
    private String name;

      @ManyToOne()
   @JoinColumn(name ="user_id")
   private User user;
}

数据库看起来不错,我查看了列名等。我不知道该怎么做才能摆脱这个错误。我有用户表和另一个名为角色的表,其中包括 id 和名称、2 个输入、USER 和 ADMIN...

似乎@JoinColumn 注释需要角色表中的一个附加列与@ManytoOne 关系,因为当我添加列时错误消失了,但是当我试图从每个用户那里获取角色时,我得到一个空列表。还设置了外键,从角色列到角色表中的 role_id 列。

【问题讨论】:

    标签: java spring postgresql spring-boot spring-security


    【解决方案1】:

    以这种方式为我工作:

    @Entity
    @Data
    @Table(name = "users")
    public class User{
    
    @ManyToMany(fetch = FetchType.EAGER)
    @JoinTable(name = "user_roles", joinColumns = {@JoinColumn(name = "user_id", referencedColumnName = "id")},
            inverseJoinColumns = {@JoinColumn(name = "role_id", referencedColumnName = "id")})
    private List<Role> roles;
    
    }
    

    然后只是角色:

    @Entity
    @Table(name = "roles")
    public class Role{
    
    @ManyToMany(mappedBy = "roles", fetch = LAZY)
    private List<User> users;
    
    }
    

    如果您对管理多对多关系的第三个表 user_roles (user_id, role_id) 没问题

    【讨论】:

    • 我实际上有一个多对多的关系,我的意思是从那个到一对多。我设法通过在角色中添加第三列和 user_id 来完成它......我不知道这是否是一个好习惯,我认为实际上我仍然有一个多对多的关系,但是有两个表.
    【解决方案2】:

    用户表:

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "user", fetch = FetchType.EAGER)
    private List<Role> roles;
    

    角色表:

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "user_id")
    private User user;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-10-01
      • 2021-06-15
      • 1970-01-01
      • 1970-01-01
      • 2018-10-19
      • 2021-06-30
      • 1970-01-01
      • 2021-07-14
      相关资源
      最近更新 更多