简体   繁体   中英

Spring boot @JoinCulumn ManyToOne relationship column does not exist

I currently have a problem with this Relationship, I have tried everything I saw on the internet. Still, I get this error: ERROR: column roles0_.user_id does not exist.

I have a boot app that has spring security, and I need to login using users from PostgreSQL database.

But I just can't get the relation between the user and the Role to work.

Here are Entity classes:

 @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;
}

The database looks fine, I looked at the column names, etc. I don't know what to do to get rid of this error. I have the user table, and another table named roles, which include id and name, 2 inputs, USER and ADMIN...

It seems that the @JoinColumn annotation requires one additional column in the roles table the one with @ManytoOne relation, because when I add the column the error disappears, but when I'm trying to get the role from each user, I get an empty List. The foreign key is set as well, from the roles column to the role_id column from role table.

worked for me this way:

@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;

}

and then in roles just:

@Entity
@Table(name = "roles")
public class Role{

@ManyToMany(mappedBy = "roles", fetch = LAZY)
private List<User> users;

}

that's if you are ok with third table user_roles (user_id, role_id) which manages the many to many relation

User table:

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

Role table:

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM