【问题标题】:Application of ManyToMany - Spring does not workManyToMany的应用-Spring不起作用
【发布时间】:2022-01-26 01:32:51
【问题描述】:

我正在实现用户和权限之间的多对多关系,我无法断定我哪里错了,它不起作用 (Unable to map collection rs.raf.demo.model.User.permissions):

@Data
@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "user_id")
    private Long userId;

    @Column
    private String username;

    @Column
    private String password;

    @ManyToMany
    @JoinTable(
            name = "USERS_PERMISSIONS",
            joinColumns = @JoinColumn(name = "USER_ID", referencedColumnName = "ID"),
            inverseJoinColumns = @JoinColumn(name = "PERMISSION_ID", referencedColumnName = "ID")
    )
    private List<Permission> permissions = new ArrayList<>();
}

================================================ ====================================

@Data
@Entity
public class Permission {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "permission_id")
    private Long userId;

    private String type;

    @ManyToMany
    @JoinTable(
            name = "USERS_PERMISSIONS",
            joinColumns = @JoinColumn(name = "PERMISSION_ID", referencedColumnName = "ID"),
            inverseJoinColumns = @JoinColumn(name = "USER_ID", referencedColumnName = "ID")
    )
    @JsonIgnore
    private List<User> users = new ArrayList<>();
}

我通过查看此示例实现了用户和权限,这是有效的(我看不出用户和权限的区别):

@Data
@Entity
@Table(name = "STUD")
public class Student {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String lastName;

    private String firstName;

    @ManyToMany
    @JoinTable(
            name = "STUDENTS_COURSES",
            joinColumns = @JoinColumn(name = "STUDENT_ID", referencedColumnName = "ID"),
            inverseJoinColumns = @JoinColumn(name = "COURSE_ID", referencedColumnName = "ID")
    )
    private List<Course> courses = new ArrayList<>();
}

================================================ ===================================

@Data
@Entity
public class Course {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String title;

    @ManyToMany
    @JoinTable(
            name = "STUDENTS_COURSES",
            joinColumns = @JoinColumn(name = "COURSE_ID", referencedColumnName = "ID"),
            inverseJoinColumns = @JoinColumn(name = "STUDENT_ID", referencedColumnName = "ID")
    )
    @JsonIgnore
    private List<Student> students = new ArrayList<>();

    public void addStudent(Student student) {
        students.add(student);
        student.getCourses().add(this);
    }

    public void removeStudent(Student student) {
        students.remove(student);
        student.getCourses().remove(this);
    }
}

【问题讨论】:

    标签: spring database spring-data many-to-many


    【解决方案1】:

    JPA 为多对多关系使用(并且可能在您的情况下创建)中间连接表,并且您不能使用与您在实体中指定的名称不同的引用列名称。

    所以你需要设置:

    • 在用户类中
    @ManyToMany
        @JoinTable(
                name = "USERS_PERMISSIONS",
                joinColumns = @JoinColumn(name = "USER_ID", referencedColumnName = "USER_ID"),
                inverseJoinColumns = @JoinColumn(name = "PERMISSION_ID", referencedColumnName = "PERMISSION_ID")
        )
    
    • 获得许可
    @ManyToMany
        @JoinTable(
                name = "USERS_PERMISSIONS",
                joinColumns = @JoinColumn(name = "PERMISSION_ID", referencedColumnName = "PERMISSION_ID"),
                inverseJoinColumns = @JoinColumn(name = "USER_ID", referencedColumnName = "USER_ID")
        )
    
    • 其他表也一样。

    【讨论】:

    • 这个方法我试过了,还是不行。它给出了同样的错误:无法映射集合 rs.raf.demo.model.User.permissions。
    • 您使用什么类型的表创建?是手动创建还是在spring yaml中ddl-auto=create-drop
    • 我建议你用@Table(name = "....")注解User并且不要使用"user"作为表名
    • 并删除referencedColumnName,因为休眠会为您处理它
    • 并启用spring.jpa.show-sql=true,这样你就可以调试你的ddls
    猜你喜欢
    • 2015-10-26
    • 2016-01-02
    • 1970-01-01
    • 2018-02-09
    • 2020-03-17
    • 2020-11-30
    • 1970-01-01
    • 2012-03-31
    • 2018-01-12
    相关资源
    最近更新 更多