Spring 将数据注册到多对多关系表中
我有“课程”和“学生”实体。他们有多对多的关系。所以,我有一个COURSE_STUDENT(包含“STUDENT_id”和“COURSE_id”列)表。我想使用按钮将学生注册到课程中。(例如,学生列出课程,然后单击“注册”按钮注册特定课程)。 当我想要创建新课程时,我会使用默认情况下来自JHipster的courseRepository和courseMapper。 但我没有课程学生的存储库和映射器文件。因为它实际上不是一个主要实体。它是为多对多关系创建的。 如何为学生注册课程 吉特回购: 我的课程实体:Spring 将数据注册到多对多关系表中,spring,spring-mvc,spring-boot,jhipster,Spring,Spring Mvc,Spring Boot,Jhipster,我有“课程”和“学生”实体。他们有多对多的关系。所以,我有一个COURSE_STUDENT(包含“STUDENT_id”和“COURSE_id”列)表。我想使用按钮将学生注册到课程中。(例如,学生列出课程,然后单击“注册”按钮注册特定课程)。 当我想要创建新课程时,我会使用默认情况下来自JHipster的courseRepository和courseMapper。 但我没有课程学生的存储库和映射器文件。因为它实际上不是一个主要实体。它是为多对多关系创建的。 如何为学生注册课程 吉特回购: 我的课
@Entity
@Table(name = "course")
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
public class Course implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@NotNull
@Column(name = "title", nullable = false)
private String title;
@Column(name = "description")
private String description;
@ManyToOne
private Instructor instructor;
@ManyToMany(fetch = FetchType.EAGER)
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
@JoinTable(name = "course_student",
joinColumns = @JoinColumn(name="courses_id", referencedColumnName="id"),
inverseJoinColumns = @JoinColumn(name="students_id", referencedColumnName="id"))
private Set<Student> students = new HashSet<>();
@实体
@表(name=“course”)
@缓存(用法=缓存并发策略。非严格读写)
公共类课程实现可序列化{
私有静态最终长serialVersionUID=1L;
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
私人长id;
@NotNull
@列(name=“title”,null=false)
私有字符串标题;
@列(name=“description”)
私有字符串描述;
@许多酮
私人教练;
@ManyToMany(fetch=FetchType.EAGER)
@缓存(用法=缓存并发策略。非严格读写)
@JoinTable(name=“课程\学生”,
joinColumns=@JoinColumn(name=“courses\u id”,referencedColumnName=“id”),
inverseJoinColumns=@JoinColumn(name=“students\u id”,referencedColumnName=“id”))
private Set students=new HashSet();
学生实体:
@Entity
@Table(name = "student")
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
public class Student implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@OneToOne
@JoinColumn(unique = true)
private User user;
@ManyToMany(fetch = FetchType.EAGER,mappedBy = "students")
@JsonIgnore
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
private Set<Course> courses = new HashSet<>();
@实体
@表(name=“student”)
@缓存(用法=缓存并发策略。非严格读写)
公共类学生实现可序列化{
私有静态最终长serialVersionUID=1L;
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
私人长id;
@奥内托内
@JoinColumn(unique=true)
私人用户;
@ManyToMany(fetch=FetchType.EAGER,mappedBy=“students”)
@杰索尼奥雷
@缓存(用法=缓存并发策略。非严格读写)
私有集课程=新HashSet();
例如,带有映射器和存储库的Createcourse函数
@PostMapping("/courses")
@Timed
public ResponseEntity<CourseDTO> createCourse(@Valid @RequestBody CourseDTO courseDTO) throws URISyntaxException {
log.debug("REST request to save Course : {}", courseDTO);
if (courseDTO.getId() != null) {
return ResponseEntity.badRequest().headers(HeaderUtil.createFailureAlert(ENTITY_NAME, "idexists", "A new course cannot already have an ID")).body(null);
}
Course course = courseMapper.toEntity(courseDTO);
course = courseRepository.save(course);
CourseDTO result = courseMapper.toDto(course);
return ResponseEntity.created(new URI("/api/courses/" + result.getId()))
.headers(HeaderUtil.createEntityCreationAlert(ENTITY_NAME, result.getId().toString()))
.body(result);
}
@PostMapping(“/courses”)
@定时
public ResponseEntity createCourse(@Valid@RequestBody CourseDTO CourseDTO)抛出URI语法异常{
debug(“保存课程的REST请求:{}”,courseDTO);
if(courseDTO.getId()!=null){
return ResponseEntity.badRequest().headers(HeaderUtil.createFailureAlert(实体名称,“idexists”,“新课程不能已经有ID”)).body(null);
}
课程=课程表至实体(课程至);
课程=课程存储。保存(课程);
CourseDTO结果=courseMapper.toDto(课程);
return ResponseEntity.created(新URI(“/api/courses/”+result.getId()))
.headers(HeaderUtil.createEntityCreationErt(实体名称,result.getId().toString())
.机构(结果);
}
关系由课程实体所有。这是因为在学生端,@manytomy
注释具有mappedBy
属性。这意味着数据库将反映课程中的集合。您需要将学生添加到该集合以保存关系。该更改需要在事务中完成
也就是说,最好在这里遵循DDD。我将在学生类中创建一个将课程作为参数的registerTo
方法。然后我将调用this.courses.add(course)
和course.getStudents()。在该方法中添加(this)