ManyToMany mapping with additional column

-1

In my study project, aimed at controlling football matches, I have the following entities:

Player

  • Name;

Startup

  • Date of completion;
  • Gols pro;
  • Goals against;

I still have to record the goals of the match per player, which should stay on the bench like this:

 Jogador               PartidaJogador                Partida
(id,nome)   (jogador_id, partida_id, numeroGols)  (id,data...)

Below the classes already created:

@Entity
public class Jogador implements Serializable {

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

    @NotNull
    private String nome;

    public Long getId() {
        return id;
    }

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

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    @Override
    public String toString() {
        return nome;
    }

}

@Entity
public class Partida implements Serializable {

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

    @NotNull
    private String adversario;

    @NotNull
    private LocalDate dataRealizacao;

    @Min(0)
    @NotNull
    private Integer golsPro;

    @Min(0)
    @NotNull
    private Integer golsContra;

    @OneToMany
    private Set<PartidaJogador> jogadoresGols = new HashSet<>();

    public Long getId() {
        return id;
    }

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

    public String getAdversario() {
        return adversario;
    }

    public void setAdversario(String adversario) {
        this.adversario = adversario;
    }

    public LocalDate getDataRealizacao() {
        return dataRealizacao;
    }

    public void setDataRealizacao(LocalDate dataRealizacao) {
        this.dataRealizacao = dataRealizacao;
    }

    public Integer getGolsPro() {
        return golsPro;
    }

    public void setGolsPro(Integer golsPro) {
        this.golsPro = golsPro;
    }

    public Integer getGolsContra() {
        return golsContra;
    }

    public void setGolsContra(Integer golsContra) {
        this.golsContra = golsContra;
    }

    public Set<PartidaJogador> getJogadoresGols() {
        return jogadoresGols;
    }

    public void setJogadoresGols(Set<PartidaJogador> jogadoresGols) {
        this.jogadoresGols = jogadoresGols;
    }


}

The basic flow should be the creation of matches, so I need to save a match object and thus save the related entity MatchPlayer as well.

How to map the PartidaJogador table to the extra column numeroGols ?

    
asked by anonymous 02.03.2017 / 13:12

1 answer

0

You need to create a PartidaJogador entity with a compound primary key that references the keys of Partida and Jogador entities. Example:

Changes the relationship in table Partida to:

@OneToMany(cascade=CascadeType.PERSIST, mappedBy="partida")
private Set<PartidaJogador> jogadoresGols = new HashSet<>();

GamePK Player

@Embeddable
public class PartidaJogadorPK implements Serializable {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    private long jogadorId;

    private long partidaId;

    public PartidaJogadorPK() {}

    public final void setJogadorId(long jogadorId) {
        this.jogadorId = jogadorId;
    }

    public final void setPartidaId(long partidaId) {
        this.partidaId = partidaId;
    }

    public final long getJogadorId() {
        return jogadorId;
    }

    public final long getPartidaId() {
        return partidaId;
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + (int) (jogadorId ^ (jogadorId >>> 32));
        result = prime * result + (int) (partidaId ^ (partidaId >>> 32));
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (!(obj instanceof PartidaJogadorPK))
            return false;
        PartidaJogadorPK other = (PartidaJogadorPK) obj;
        if (jogadorId != other.jogadorId)
            return false;
        if (partidaId != other.partidaId)
            return false;
        return true;
    }
}

MatchPlayer

@Entity
public class PartidaJogador {

    @EmbeddedId
    private PartidaJogadorPK pk = new PartidaJogadorPK();


    @MapsId("partidaId")
    @ManyToOne
    @JoinColumn(name="partidaId", referencedColumnName="id")
    private Partida partida;


    @MapsId("jogadorId")
    @ManyToOne
    @JoinColumn(name="jogadorId", referencedColumnName="id")
    private Jogador jogador;

    private int numeroDeGols;

    public final Partida getPartida() {
        return partida;
    }

    public final void setPartida(Partida partida) {
        this.partida = partida;
    }

    public final Jogador getJogador() {
        return jogador;
    }

    public final void setJogador(Jogador jogador) {
        this.jogador = jogador;
    }

    public final int getNumeroDeGols() {
        return numeroDeGols;
    }

    public final void setNumeroDeGols(int numeroDeGols) {
        this.numeroDeGols = numeroDeGols;
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((pk == null) ? 0 : pk.hashCode());
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (!(obj instanceof PartidaJogador))
            return false;
        PartidaJogador other = (PartidaJogador) obj;
        if (pk == null) {
            if (other.pk != null)
                return false;
        } else if (!pk.equals(other.pk))
            return false;
        return true;
    }
}

Example usage:

em.getTransaction().begin();

Jogador jogador = new Jogador();
jogador.setNome("Presunto");
em.persist(jogador);


Partida partida = new Partida();
partida.setAdversario("Tabajara");
partida.setDataRealizacao(LocalDate.now());
partida.setGolsPro(3);
partida.setGolsContra(2);

em.persist(partida);

PartidaJogador partidaJogador = new PartidaJogador();
partidaJogador.setJogador(jogador);
partidaJogador.setPartida(partida);
partidaJogador.setNumeroDeGols(2);

//em.persist(partidaJogador);

Set<PartidaJogador> partidaJogadores = new HashSet<>();
partidaJogadores.add(partidaJogador);

partida.setJogadoresGols(partidaJogadores);

em.getTransaction().commit();

Addendum: It may be interesting to consider whether the goal should also be treated as an entity, since it has relevant attributes of its own, such as the moment it was marked, the author, the author of the assistance, etc.

    
02.03.2017 / 15:25