如何将2个字段映射到相同的多对多关联?



有一个Spring JPA应用程序:

对于一个用例,我想将所有学生数据读取到Student集合中,如下面的第一个集合(courserrepository . findall()) -这仅用于读取与课程相关的学生。

对于第二个用例,我想读&仅使用Student uuid更新学生集(因为这样可以更快地避免许多连接/级联)—如下面的第二个set—这仅用于向课程添加或删除学生。

@Entity
@Table(...)
public class Course {
@Id
private UUID id;
@ManyToMany(fetch = FetchType.LAZY, cascade = {CascadeType.DETACH, CascadeType.MERGE, CascadeType.REFRESH, CascadeType.PERSIST})
@JoinTable(
schema = "...",
name = "...",
joinColumns = {@JoinColumn(name = "course_id", referencedColumnName = "id")},
inverseJoinColumns = {@JoinColumn(name = "student_id", referencedColumnName = "id")}
)
private Set<Student> students = new java.util.HashSet<>();
@ManyToMany
@JoinTable(
schema = "...",
name = "...",
joinColumns = {@JoinColumn(name = "course_id", referencedColumnName = "id")},
inverseJoinColumns = {@JoinColumn(name = "student_id", referencedColumnName = "id")}
)
private Set<UUID> students = new java.util.HashSet<>();
...
}
@Entity
@Table(name="student")
public class Student {
@Id
private UUID id;
private String name;
...
}
@Repository
public interface CourseRepository extends JpaRepository<Course, UUID> {}

您应该将多对多关联建模为两个一对多关联,因为这是您最终需要的。这样,只需持久化这个新的CourseStudentAssignment实体就可以完成赋值。

@Entity
public class CourseStudentAssignment {
@EmbeddedId
CourseStudentAssignmentId id;
@ManyToOne(fetch = LAZY)
@MapsId("courseId")
Course course;
@ManyToOne(fetch = LAZY)
@MapsId("studentId")
Student student;
}
@Embeddable
public class CourseStudentAssignmentId {
UUID courseId;
UUID studentId;
}
@Entity
@Table(...)
public class Course {
@Id
private UUID id;
@OneToMany(mappedBy = "course", fetch = FetchType.LAZY, cascade = {CascadeType.DETACH, CascadeType.MERGE, CascadeType.REFRESH, CascadeType.PERSIST})
private Set<CourseStudentAssignment> studentAssignments = new java.util.HashSet<>();
}
@Entity
@Table(...)
public class Student {
@Id
private UUID id;
@OneToMany(mappedBy = "student", fetch = FetchType.LAZY, cascade = {CascadeType.DETACH, CascadeType.MERGE, CascadeType.REFRESH, CascadeType.PERSIST})
private Set<CourseStudentAssignment> courseAssignments = new java.util.HashSet<>();
}

最新更新