Bom dia, estou com dificuldades para fazer exclusão de registros em um relacionamento n:n, segue minhas classes mapeadas no hibernate:
package gov.pr.celepar.instituicao.pojo;
import java.io.Serializable;
import java.util.Date;
import java.util.HashSet;
import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import org.apache.commons.lang.builder.ToStringBuilder;
@Entity
@Table(name = "tb_instituicao", schema = "public")
public class Instituicao implements Serializable {
private static final long serialVersionUID = 1324030534076244202L;
@Id
@SequenceGenerator(name = "INSTITUICAO_ID_SEQ", sequenceName = "tb_instituicao_cod_instituicao_seq", allocationSize = 300)
@GeneratedValue(strategy = GenerationType.AUTO, generator = "INSTITUICAO_ID_SEQ")
@Column(name = "cod_instituicao", nullable = false)
private Integer id;
@Column(name = "cnpj", nullable = false, length = 14)
private String cnpj;
@Column(name = "razao_social", nullable = false, length = 100)
private String razaoSocial;
@Column(name = "porte", nullable = false)
private Integer porte;
@Temporal(TemporalType.DATE)
@Column(name = "data_criacao", nullable = false)
private Date dataCriacao;
@OneToMany(fetch = FetchType.EAGER, mappedBy = "instituicao", cascade = CascadeType.ALL)
private Set<Telefone> telefones = new HashSet<Telefone>();
@OneToOne(fetch = FetchType.EAGER)
@JoinColumn(name="cod_natureza_juridica", nullable=false)
private NaturezaJuridica naturezaJuridica;
@ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.MERGE)
@JoinTable(name = "tb_instituicao_area_interesse",
joinColumns = @JoinColumn(name = "cod_instituicao", nullable = false),
inverseJoinColumns = @JoinColumn(name = "cod_area_interesse", nullable = false))
private Set<AreaInteresse> areaInteresses = new HashSet<AreaInteresse>();
//Construtor padrão
public Instituicao() {}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getCnpj() {
return cnpj;
}
public void setCnpj(String cnpj) {
this.cnpj = cnpj;
}
public String getRazaoSocial() {
return razaoSocial;
}
public void setRazaoSocial(String razaoSocial) {
this.razaoSocial = razaoSocial;
}
public static long getSerialversionuid() {
return serialVersionUID;
}
public Integer getPorte() {
return porte;
}
public void setPorte(Integer porte) {
this.porte = porte;
}
public Date getDataCriacao() {
return dataCriacao;
}
public void setDataCriacao(Date dataCriacao) {
this.dataCriacao = dataCriacao;
}
public Set<Telefone> getTelefones() {
return telefones;
}
public void setTelefones(Set<Telefone> telefones) {
this.telefones = telefones;
}
public NaturezaJuridica getNaturezaJuridica() {
return naturezaJuridica;
}
public void setNaturezaJuridica(NaturezaJuridica naturezaJuridica) {
this.naturezaJuridica = naturezaJuridica;
}
public Set<AreaInteresse> getAreaInteresses() {
return areaInteresses;
}
public void setAreaInteresses(Set<AreaInteresse> areaInteresses) {
this.areaInteresses = areaInteresses;
}
public String toString() {
return new ToStringBuilder(this)
.append("id", getId())
.toString();
}
}
package gov.pr.celepar.instituicao.pojo;
import java.util.HashSet;
import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.Table;
import org.apache.commons.lang.builder.EqualsBuilder;
@Entity
@Table(name = "tb_area_interesse", schema = "public")
public class AreaInteresse {
@Id
@Column(name = "cod_area_interesse", nullable = false)
private Integer codAreaInteresse;
@Column(name = "descricao", nullable = false, length = 80)
private String descricao;
@ManyToMany(fetch = FetchType.EAGER, mappedBy = "areaInteresses", cascade = CascadeType.ALL)
// @JoinTable(name = "tb_instituicao_area_interesse",
// joinColumns = @JoinColumn(name = "cod_area_interesse", nullable = false),
// inverseJoinColumns = @JoinColumn(name = "cod_instituicao", nullable = false))
private Set<Instituicao> instituicaos = new HashSet<Instituicao>();
public Integer getCodAreaInteresse() {
return codAreaInteresse;
}
public void setCodAreaInteresse(Integer codAreaInteresse) {
this.codAreaInteresse = codAreaInteresse;
}
public String getDescricao() {
return descricao;
}
public void setDescricao(String descricao) {
this.descricao = descricao;
}
public Set<Instituicao> getInstituicaos() {
return instituicaos;
}
public void setInstituicaos(Set<Instituicao> instituicaos) {
this.instituicaos = instituicaos;
}
public boolean equals(Object other) {
if ( !(other instanceof AreaInteresse) ) return false;
AreaInteresse castOther = (AreaInteresse) other;
return new EqualsBuilder()
.append(this.getCodAreaInteresse(), castOther.getCodAreaInteresse())
.isEquals();
}
}
O que eu estou tentando fazer: na função para alteração de dados eu estou mandando para action um array das areas de interesse para atualização da tabela tb_instituicao_area_interesse, mas o hibernate parece não entender que eu quero atualizar esta tabela(excluir o registros que não serão mais usados e incluir os novos caso sejam selecionados). O hibernate consegue fazer isso ou vou ter que excluir manualmente os registros da tabela e inserir novamente?