Nesse exemplo, temos uma entidade "Livro" e uma entidade "Autor" que possuem um relacionamento muitos-para-muitos entre si. A anotação @ManyToMany é usada em ambos os campos "autores" (na classe Livro) e "livros" (na classe Autor) para indicar esse relacionamento. A anotação @JoinTable é usada para criar uma tabela de junção chamada "livro_autor" que mapeia o relacionamento, especificando as colunas "livro_id" e "autor_id" que serão usadas para fazer a junção entre as tabelas.

🧑🏼‍💻 Mão no código

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

    @Column
    private String titulo;

    @ManyToMany(cascade = CascadeType.ALL)
    @JoinTable(
        name = "livro_autor",
        joinColumns = @JoinColumn(name = "livro_id"), // Entidade atual
        inverseJoinColumns = @JoinColumn(name = "autor_id") // Entidade a qual quero relacionar atual
    )
		@JsonIgnoreProperties("livros")
    private List<Autor> autores;

    // getters e setters
}

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

    @Column
    private String nome;

    @ManyToMany(mappedBy = "autores") // Nome da propriedade de ligação na classe Livro (autores)
    private List<Livro> livros;

    // getters e setters
}