2015-11-07 5 views
1

Это моя примерная схема, и я создал объекты jpa в eclipse. Я использую репозитории весны jpa. Я хочу знать, нужно ли мне создавать интерфейс репозитория для таблицы курса студента.Join Table и Spring Data Repository

У меня есть сомнения в отношении метода addStudentCourse как для классов ученика, так и для курса. Список studentCourses всегда будет нулевым для нового объекта, как я могу заполнить таблицу курса студента при регистрации информации о студенте в системном i.e сохранении метода на studentRepository.

enter image description here

Student.java

@Entity 
@NamedQuery(name="Student.findAll", query="SELECT s FROM Student s") 
public class Student implements Serializable { 
    private static final long serialVersionUID = 1L; 

    @Id 
    private long studentid; 

    private String studentname; 

    //bi-directional many-to-one association to StudentCourse 
    @OneToMany(mappedBy="student") 
    private List<StudentCourse> studentCourses; 

    ........ 

    public StudentCourse addStudentCourse(StudentCourse studentCourse) { 
     getStudentCourses().add(studentCourse); 
     studentCourse.setStudent(this); 

     return studentCourse; 
    } 

    public StudentCourse removeStudentCourse(StudentCourse studentCourse) { 
     getStudentCourses().remove(studentCourse); 
     studentCours.setStudent(null); 

     return studentCourse; 
    } 

Course.java

@Entity 
@NamedQuery(name="Course.findAll", query="SELECT c FROM Course c") 
public class Course implements Serializable { 
    private static final long serialVersionUID = 1L; 

    @Id 
    private long courseid; 

    private String coursename; 

    //bi-directional many-to-one association to StudentCourse 
    @OneToMany(mappedBy="course") 
    private List<StudentCourse> studentCourses; 

    public StudentCourse addStudentCourse(StudentCourse studentCourse) { 
     getStudentCourses().add(studentCourse); 
     studentCourse.setCourse(this); 

     return studentCourse; 
    } 

    public StudentCourse removeStudentCourse(StudentCourse studentCourse) { 
     getStudentCourses().remove(studentCourse); 
     studentCourse.setCourse(null); 

     return studentCourse; 
    } 

StudentCourse.java

@Entity 
    @Table(name="STUDENT_COURSE") 
    @NamedQuery(name="StudentCourse.findAll", query="SELECT s FROM StudentCourse s") 
    public class StudentCourse implements Serializable { 
     private static final long serialVersionUID = 1L; 

     @EmbeddedId 
     private StudentCoursePK id; 

     private String status; 

     //bi-directional many-to-one association to Course 
     @ManyToOne 
     @JoinColumn(name="COURSEID") 
     private Course course; 

     //bi-directional many-to-one association to Student 
     @ManyToOne 
     @JoinColumn(name="STUDENTID") 
     private Student student; 

     ... 
} 

StudentCoursePK.java

@Embeddable 
public class StudentCoursePK implements Serializable { 
    //default serial version id, required for serializable classes. 
    private static final long serialVersionUID = 1L; 

    @Column(insertable=false, updatable=false) 
    private long studentid; 

    @Column(insertable=false, updatable=false) 
    private long courseid; 

    ... 
} 

ответ

0

Если я понял ваш вопрос правильно, что вы хотите сделать, это быть в состоянии спасти студент от метода сохранения в StudentRepository, и что это вставляет/обновляет студент, а также вставляет/обновляет таблицу присоединиться.

Поскольку Студенческая сущность не является стороной-владельцем (она отображена «учеником» в StudentCourse), сохранение студента не приведет к спасению на StudentCourse. Для этого вы можете добавить каскад свойству список для вставки, обновления ... или просто для всего:

@OneToMany(mappedBy="student", cascade = CascadeType.ALL) 
private List<StudentCourse> studentCourses = new ArrayList<StudentCourse>(); 

Тогда вы могли бы метод на вашем @Service класс, который выглядит следующим образом:

@Transactional 
public void enrollInCourse(Student student, Course course) { 
    StudentCourse sc = new StudentCourse(); 
    sc.setStudent(student); 
    sc.setCourse(course); 
    sc.setStatus("Enrolled"); 
    student.getStudentCourses().add(sc); 

    studentRepository.save(student); 
} 

Это также заполнит таблицу StudentCourse.

Таким образом, нет необходимости в репозитории, хотя если каскад не работает должным образом, вы можете создать его и сохранить объект StudentCourse самостоятельно.

Если это не сработает, вы можете попробовать изменить свои сопоставления. Для n-арных отношений или объединения таблиц с дополнительными столбцами я всегда определяю отношения @ManytoOne внутри класса @Embeddable, а в сущности, представляющей таблицу соединения, я определяю getters как @Transient, чтобы разрешить доступ к отображаемым объектам, находящимся внутри встроенного составного Id ,

Вы можете увидеть пример here и сообщение в блоге об этом подходе here.

Смежные вопросы