Criando mapeamento N-N com Hibernate e adicionando data de cadastro no relacionamento
Imagine a seguinte situação: Precisamos relacionar duas tabelas, clínica e médico, sendo que nesse relacionamento eu desejo guardar a data que o médico foi vinculado aquela clínica. No nosso exemplo vamos partir do ponto que já tenhamos o médico e a clinica devidamente mapeados e registros de ambos inseridos no banco.
Crie uma classe como exemplo abaixo:
@SuppressWarnings("serial")
@Embeddable
public class Clinica_MedicoPK implements Serializable{
@ManyToOne (fetch = FetchType.EAGER )
@JoinColumn (name= "cnpj_clinica" )
@OnDelete(action = OnDeleteAction.CASCADE)
@Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN)
private Clinica clinica;
@ManyToOne (fetch = FetchType.EAGER )
@JoinColumn (name= "crm_medico" )
@OnDelete(action = OnDeleteAction.CASCADE)
@Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN)
private Medico medico;
@Temporal(TemporalType.DATE)
private Date data_cadastro;
Temos então uma instancia da classe Clinica e uma da classe Medico como também uma instancia da classe Date que irá guardar a data de cadastro. Se você já notou temos a anotação @Embeddable, que indica que essa classe funciona com uma chave composta para uma tabela. Feito isso crie outra classe como o exemplo abaixo:
@Entity
@Table (name= "clinica_medico")
public class Clinica_Medico implements Serializable{
@EmbeddedId
private Clinica_MedicoPK clinica_MedicoPK;
public Clinica_MedicoPK getClinica_MedicoPK() {
return clinica_MedicoPK;
}
public void setClinica_MedicoPK(Clinica_MedicoPK clinica_MedicoPK) {
this.clinica_MedicoPK = clinica_MedicoPK;
}
}
Essa será nossa tabela com uma instancia de Clinica_MedicoPK que será chave composta da tabela clinica_medico.
Abaixo temos uma exemplo de como inserir:
//a clinica e o médico já inseridos no banco
Clinica clinica = repositorio.buscarClinica(id_clinica);
Medico medico = repositorio.buscarMedico(id_medico);
Clinica_MedicoPK clMedicoPK = new Clinica_MedicoPK();
//seto a clinica no pk
clMedicoPK.setClinica(clinica);
//seto o médico
clMedicoPK.setMedico(medico);
//seto a data de cadastro
clMedicoPK.setData_cadastro(new Date(System.currentTimeMillis()));
//instacio a classe que vai conter o pk
Clinica_Medico clinica_Medico = new Clinica_Medico();
//adiciono a pk com a clinica e o médico
clinica_Medico.setClinica_MedicoPK(clMedicoPK);
//insiro no banco o vínculo da clinica com o medico
repositorio.salvarClinicaMedico(clinica_Medico);