JPA @ManyToMany with additional column

2

I am trying to connect two tables with a many to many relationship but, in the third table that relates them, apart from the id of each of the other two tables, there is a third field and I do not know how to indicate this third field.

I have Professor class with fields id and name.

@Entity
@Table(name="Profesor")
public class Profesor implements Serializable  {

  @Id
  private int id;
  private String nombre;

  @ManyToMany(cascade = {CascadeType.ALL})
  @JoinTable(name="ProfesorModulo", joinColumns={@JoinColumn(name="IdProfesor")}, inverseJoinColumns={@JoinColumn(name="IdModulo")})
  private Set<Modulo> modulos=new HashSet();

  //constructor, getters y setters
}

I have a Module class with id and name fields.

@Entity
@Table(name="Modulo")
public class Modulo implements Serializable {

  @Id
  private int id;
  private String nombre;

  @ManyToMany(cascade = {CascadeType.ALL},mappedBy="modulos")
  private Set<Profesor> profesores=new HashSet();

  //constructor, getters y setters
}

I have TeacherModule class with idProfessor, idModule and date fields. This date field (of type Date) is the one that I do not know how to indicate in the JPA annotations.

    
asked by Ucha 30.07.2018 в 00:09
source

1 answer

0

I have already managed to solve it and it works perfectly for me. The classes would be:

Professor:

package pojo;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;

import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;

@Entity(name = "Profesor")
@Table(name = "profesor")
public class Profesor implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private Long id;

    private String nombre;

    @OneToMany(fetch = FetchType.EAGER, mappedBy = "profesor")  
    private List<Profesormodulo> profesormodulos = new ArrayList<>();

    public Profesor() {

    }   

    public Profesor(String nombre) {
        this.nombre = nombre;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getNombre() {
        return nombre;
    }

    public void setNombre(String nombre) {
        this.nombre = nombre;
    }

    public List<Profesormodulo> getProfesormodulos() {
        return profesormodulos;
    }

    public void setProfesormodulos(List<Profesormodulo> profesormodulos) {
        this.profesormodulos = profesormodulos;
    } 

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;

        if (o == null || getClass() != o.getClass()) 
            return false;

        Profesor post = (Profesor) o;
        return Objects.equals(nombre, post.nombre);
    }

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

    public String toString() {
        return "Profesor [id=" + id + ", nombre=" + nombre + "]";
    }

}

Module:

package pojo;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;

@Entity(name = "Modulo")
@Table(name = "modulo")
public class Modulo implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private Long id;

    private String nombre;

    @OneToMany(mappedBy = "modulo") 
    private List<Profesormodulo> profesormodulos = new ArrayList<>();

    public Modulo() {

    }

    public Modulo(String nombre) {
        super();
        this.nombre = nombre;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getNombre() {
        return nombre;
    }

    public void setNombre(String nombre) {
        this.nombre = nombre;
    }

    public List<Profesormodulo> getProfesormodulos() {
        return profesormodulos;
    }

    public void setProfesormodulos(List<Profesormodulo> profesormodulos) {
        this.profesormodulos = profesormodulos;
    }

    @Override
    public String toString() {
        return "Modulo [id=" + id + ", nombre=" + nombre + "]";
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Modulo modulo = (Modulo) o;
        return Objects.equals(nombre, modulo.nombre);
    }

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

}

Profesormodulo:

package pojo;

import java.util.Date;
import java.util.Objects;

import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.IdClass;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;

@Entity(name = "Profesormodulo")
@Table(name = "profesormodulo")
@IdClass(ProfesormoduloId.class)
public class Profesormodulo {

    @Id
    private Long idProfesor;

    @Id
    private Long idModulo;

    private Date fecha;

    @ManyToOne
    @JoinColumn(name = "idProfesor", referencedColumnName = "id", insertable = false, updatable = false)
    private Profesor profesor;

    @ManyToOne
    @JoinColumn(name = "idModulo", referencedColumnName = "id", insertable = false, updatable = false)
    private Modulo modulo;

    public Profesormodulo() {

    }

    public Profesormodulo(Long idProfesor, Long idModulo, Date fecha) {
        this.idProfesor = idProfesor;
        this.idModulo = idModulo;
        this.fecha = fecha;
    }

    public Long getIdProfesor() {
        return idProfesor;
    }

    public void setIdProfesor(Long idProfesor) {
        this.idProfesor = idProfesor;
    }

    public Long getIdModulo() {
        return idModulo;
    }

    public void setIdModulo(Long idModulo) {
        this.idModulo = idModulo;
    }

    public Date getFecha() {
        return fecha;
    }

    public void setFecha(Date fecha) {
        this.fecha = fecha;
    }

    public Profesor getProfesor() {
        return profesor;
    }

    public void setProfesor(Profesor profesor) {
        this.profesor = profesor;
    }

    public Modulo getModulo() {
        return modulo;
    }

    public void setModulo(Modulo modulo) {
        this.modulo = modulo;
    }



    @Override
    public String toString() {
        return "Profesormodulo [idProfesor=" + idProfesor + ", idModulo=" + idModulo + ", fecha=" + fecha
                + ", profesor=" + profesor + ", modulo=" + modulo + "]";
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;

        if (o == null || getClass() != o.getClass())
            return false;

        Profesormodulo that = (Profesormodulo) o;
        return Objects.equals(profesor, that.profesor) &&
                Objects.equals(modulo, that.modulo);
    }

    @Override
    public int hashCode() {
        return Objects.hash(profesor, modulo);
    }

}

ProfesormoduloId:

package pojo;

import java.io.Serializable;
import java.util.Objects;

import javax.persistence.Column;

public class ProfesormoduloId implements Serializable {

    private static final long serialVersionUID = 1L;

    @Column(name = "idProfesor")
    private Long idProfesor;

    @Column(name = "idModulo")
    private Long idModulo;

    public ProfesormoduloId() {

    }

    public ProfesormoduloId(Long idProfesor, Long idModulo) {
        this.idProfesor = idProfesor;
        this.idModulo = idModulo;
    }   

    public Long getIdProfesor() {
        return idProfesor;
    }

    public void setIdProfesor(Long idProfesor) {
        this.idProfesor = idProfesor;
    }

    public Long getIdModulo() {
        return idModulo;
    }

    public void setIdModulo(Long idModulo) {
        this.idModulo = idModulo;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;

        if (o == null || getClass() != o.getClass()) 
            return false;

        ProfesormoduloId that = (ProfesormoduloId) o;
        return Objects.equals(idProfesor, that.idProfesor) && 
               Objects.equals(idModulo, that.idModulo);
    }

    @Override   
    public int hashCode() {
        return Objects.hash(idProfesor, idModulo);
    }

    @Override
    public String toString() {
        return "ProfesormoduloId [idProfesor=" + idProfesor + ", idModulo=" + idModulo + "]";
    }

}

In the Database I have three tables that are:

teacher (id name, int type (11); name name, varchar type (100))

module (Name id, Type int (11); Name name, Type varchar (100))

profesormodulo (Name idTeacher, Type int (11); Name idModule, Type int (11); Name date, Type date)

    
answered by 26.08.2018 / 18:20
source