Bir Class (Sınıfımız) birden fazla öğrenciye sahip olabilir.

Bir Öğrencimiz de birden fazla sınıfa girebilsin.




Biz artık hangi öğrenci hangi sınıfta hangi sınıfta da hangi öğrenci var bunları çözebilmemiz ve bu sürecin ilerleyebilmesi için de bir tane JoinTable'ye ihtiyaç vardır.

Student.java

@Entity
@Table(name = "student")
public class Student {
 
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private long id;
 
    @Column(name = "first_name")
    private String firstName;
 
    @ManyToMany(mappedBy = "students")
    private List<Class> classes;
 
    public Student() {
    }
 
    public Student(long id, String firstName, List<Class> classes) {
        this.id = id;
        this.firstName = firstName;
        this.classes = classes;
    }
    // getters ve setters
}

Class.java'yı da güncelleyelim...


@ManyToMany
@JoinTable(
        name = "class_student",
        joinColumns = @JoinColumn(name="class_id"),
        inverseJoinColumns = @JoinColumn(name="student_id")
)
public List<Student> students;


Join Table : Bir tablodur ve 2 tane tablo arasında ilişkiyi sağlar 2 tablo için de foreign key tanımlar. Biz burada @JoinTable kullandık ve dedik ki class_student tablosunda class_id columnuna bak eğer ki ilişki kurmak istiyorsan. Tam tersi olarak da, student_id columnuna bak class_student tablosundaki.

Sonra hibernate bu ilişkiyi, class ve students arasında ilişki kurmak için kullanacaktır.

Bütün Many-To-Many ilişkilerinin 2 tarafı vardır.

  1. Owning Side(Bizim burda Class) ve
  2. Non-owning Side (Bizim burda Student) oluyor.

Eğer ki ilişki bi-directional ise :

Her iki tarafda owning-side olarak design edilebilir.

---> Non-owning side @ManyToMany tarafında "mappedBy" elemanına sahip olmalıdır.