单向ManyToMany只读关系

des*_*oss 7 java hibernate jpa spring-boot

我有一个实体学生和一个实体课程.一名学生可以与0个或更多课程相关联.副课程,一门课程可以有0个或更多学生.

学生实体:

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

    @Id
    private Integer id;

    private String name;

    @ManyToMany(fetch = EAGER)
    @JoinTable(name = "student_course",
            joinColumns = @JoinColumn(
                    name = "studentId",
                    referencedColumnName = "id",
                    insertable = false,
                    updatable = false
            ),
            inverseJoinColumns = @JoinColumn(
                    name = "courseId",
                    referencedColumnName = "id",
                    insertable = false,
                    updatable = false)
    )
    private Collection<Course> courses;
}
Run Code Online (Sandbox Code Playgroud)

课程实体:

@Data
@Entity(name = "course")
public class Course {

    @Id
    private Integer id;

    private String name;

    @ManyToMany(mappedBy = "courses")
    private Collection<Student> students;
}
Run Code Online (Sandbox Code Playgroud)

和实体课程中的反向关联.

这两个@ManyToMany关联都应该是readonly.我的问题是,当我尝试保存学生时, Hibernate尝试更新相关的集合.

以下是hibernate登录学生更新的内容:

Hibernate: 
/* delete collection model.student.courses */ 
delete from `student_course` 
where `studentId`=?

Hibernate: 
/* insert collection row  */
insert into `student_course` (`studentId`, `courseId`) 
values (?, ?)
Run Code Online (Sandbox Code Playgroud)

正如你可以看到Hibernate是试图更新存储在两个实体之间的关联的表.这些是我想要避免的查询.

Tin*_*yOS 0

学生班级:

@ManyToMany(fetch = LAZY)
@JoinTable(
    name="STUDENT_COURSE"
    , joinColumns={
        @JoinColumn(name="STUDENT_ID")
        }
    , inverseJoinColumns={
        @JoinColumn(name="COURSE_ID")
        }
    )
private List<Course> courses;
Run Code Online (Sandbox Code Playgroud)

课程类别:

@ManyToMany(mappedBy="courses")
private List<Student> students;
Run Code Online (Sandbox Code Playgroud)

正如您所知,根据 JPA 2.0 规范,默认的获取是:

OneToMany: LAZY
ManyToOne: EAGER
ManyToMany: LAZY
OneToOne: EAGER
Run Code Online (Sandbox Code Playgroud)

在最新版本的 hibernate fetch 类型中,默认情况下渴望所有映射,但如果我们使用 JPA 注释,那么它与 JPA 默认值一致。