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是试图更新也存储在两个实体之间的关联的表.这些是我想要避免的查询.
学生班级:
@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 默认值一致。
归档时间: |
|
查看次数: |
385 次 |
最近记录: |