Las entidades, que son las mismas que en hibernate:
package com.trifulcas.SpringBootBiblioteca.model; import java.util.Set; import com.fasterxml.jackson.annotation.JsonIgnore; import jakarta.persistence.Entity; import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; import jakarta.persistence.Id; import jakarta.persistence.OneToMany; import jakarta.persistence.Table; @Entity @Table(name = "genero") public class Genero { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private int idgenero; private String nombre; // Carga perezosa, pero al serializar siempre carga // Mapeamos por 'genero', que es el campo en la entidad relacionada @OneToMany(mappedBy = "genero") @JsonIgnore // Quitar este campo NO de la entidad SI de la srialización private Set<Libro> libros; // Constructor vacío public Genero() { } // Constructor con parámetros public Genero(String nombre) { this.nombre = nombre; } // Getters y Setters public int getIdgenero() { return idgenero; } public void setIdgenero(int idgenero) { this.idgenero = idgenero; } public String getNombre() { return nombre; } public void setNombre(String nombre) { this.nombre = nombre; } public Set<Libro> getLibros() { return libros; } public void setLibros(Set<Libro> libros) { this.libros = libros; } // Método toString (opcional) @Override public String toString() { return "Genero{" + "idgenero=" + idgenero + ", nombre='" + nombre + '\'' + '}'; } }
package com.trifulcas.SpringBootBiblioteca.model; import java.util.Set; import jakarta.persistence.Entity; import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; import jakarta.persistence.Id; import jakarta.persistence.JoinColumn; import jakarta.persistence.JoinTable; import jakarta.persistence.ManyToMany; import jakarta.persistence.ManyToOne; import jakarta.persistence.Table; @Entity @Table(name = "libro") public class Libro { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private int idlibro; // Carga ansiosa. El nombre del campo es el mapping en genero @ManyToOne @JoinColumn(name = "idgenero") private Genero genero; private String titulo; private int paginas; // Cuando tenemos many to many tenemos que elegir donde montamos // toda la relación con la especificación de la tabla intermedia // Y los campos relacionados. Yo lo he hecho aquí pero podría ser // en autor, es lo mismo @ManyToMany @JoinTable( name = "libro_autor", joinColumns = @JoinColumn(name = "idlibro"), inverseJoinColumns = @JoinColumn(name = "idautor") ) // Utilizamos set porque son valores únicos pero podría ser List private Set<Autor> autores; // Constructor vacío public Libro() { } // Constructor con parámetros public Libro(Genero genero, String titulo, int paginas) { this.genero = genero; this.titulo = titulo; this.paginas = paginas; } // Getters y Setters public int getIdlibro() { return idlibro; } public void setIdlibro(int idlibro) { this.idlibro = idlibro; } public Genero getGenero() { return genero; } public void setGenero(Genero genero) { this.genero = genero; } public String getTitulo() { return titulo; } public void setTitulo(String titulo) { this.titulo = titulo; } public int getPaginas() { return paginas; } public void setPaginas(int paginas) { this.paginas = paginas; } public Set<Autor> getAutores() { return autores; } public void setAutores(Set<Autor> autores) { this.autores = autores; } // Método toString (opcional) @Override public String toString() { return "Libro{" + "idlibro=" + idlibro + ", genero=" + genero + ", titulo='" + titulo + '\'' + ", paginas=" + paginas + '}'; } }
package com.trifulcas.SpringBootBiblioteca.model; import java.util.Set; import com.fasterxml.jackson.annotation.JsonIgnore; import jakarta.persistence.Entity; import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; import jakarta.persistence.Id; import jakarta.persistence.ManyToMany; import jakarta.persistence.Table; @Entity @Table(name = "autor") public class Autor { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private int idautor; private String nombre; // Como todas las indicaciones de tablas intermedias y foreign keys // Las hemos puesto en libro aquí podemos usar solo autores @ManyToMany(mappedBy = "autores") @JsonIgnore // Para evitar bucles infinitos private Set<Libro> libros; // Constructor vacío public Autor() { } // Constructor con parámetros public Autor(String nombre) { this.nombre = nombre; } // Getters y Setters public int getIdautor() { return idautor; } public void setIdautor(int idautor) { this.idautor = idautor; } public String getNombre() { return nombre; } public void setNombre(String nombre) { this.nombre = nombre; } public Set<Libro> getLibros() { return libros; } public void setLibros(Set<Libro> libros) { this.libros = libros; } // Método toString (opcional) @Override public String toString() { return "Autor{" + "idautor=" + idautor + ", nombre='" + nombre + '\'' + '}'; } }