@ManyToMany

Exemple entre deux Entities Movie et Genre

import javax.persistence.*;
import java.util.*;

@Entity
public class Movie {
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE)
    private Long id;

    // ...


    /**
     * Par défaut FetchType.LAZY pour @OneToMany et @ManyToMany
     * Et FetchType.EAGER pour @OneToOne et @ManyToOne
     */
   
    @ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE})
    @JoinTable(
            name = "movie_genre",
            joinColumns = @JoinColumn(name = "movie_id", referencedColumnName = "id"),
            inverseJoinColumns = @JoinColumn(name = "genre_id", referencedColumnName = "id")
    )
    private Set<Genre> genres = new HashSet<>();
    

    // GETTERS & SETTERS & AUTRES METHODES DE CLASSE
    public Set<Genre> getGenres() {
        return Collections.unmodifiableSet(genres);
    }

    public Movie addGenre(Genre genre) {
        if(genre != null) {
            genres.add(genre);
            genre.getMovies().add(this);
        }
        return this;
    }

    public Movie removeGenre(Genre genre) {
        if(genre != null) {
            genres.remove(genre);
            genre.getMovies().remove(this);
        }
        return this;
    }

    // equals() et hascode() pour comparer les objets
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof Movie)) return false;
        Movie movie = (Movie) o;
        return getId().equals(movie.getId())
                && getName().equals(movie.getName())
                && getDescription().equals(movie.getDescription())
                && getCertification() == movie.getCertification()
                && getReviews().equals(movie.getReviews());
    }

    @Override
    public int hashCode() {
        return Objects.hash(getId(), getName(), getDescription(), getCertification(), getReviews());
    }
}Langage du code : PHP (php)
import javax.persistence.*;
import java.util.*;

@Entity
public class Genre {
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE)
    private Long id;

    @Column(unique = true)
    private String name;

    @ManyToMany(mappedBy = "genres")
    private Set<Movie> movies = new HashSet<>();

    // ... Getters et setters

    // equals() & hasCode(): la comparaison sur l'attribut "name" est suffisant car on considère que ce dernier est unique
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof Genre)) return false;

        Genre other = (Genre) o;
        return getName().equals(other.getName()); // Ou Objects.equals(name, other.getName())
    }

    @Override
    public int hashCode() {
        return Objects.hash(getName());
    }

    public Set<Movie> getMovies() {
        //return Collections.unmodifiableSet(movies);
        return movies;
    }

    @Override
    public String toString() {
        return "Genre{" +
                "id=" + id +
                ", name='" + name + '\'' +
                '}';
    }
}

Langage du code : JavaScript (javascript)