Excluir dados em relacionamento @ManytoMany

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?

Olá gRoOve, faz mais fácil, crie um relacionamento @OneToMany e @ManyToOne que na verdade seria o @ManyToMany na seguinte estrutura:

Com essa estrutura, você terá o controle da sua nova entidade InstituicaoArea, e aí é só pesquisar as informações certas e deletar direto na Entidade InstituicaoArea.

Eu teria que criar uma classe para representar a tabela tb_instituicao_area_interesse ?

Isso mesmo gRoOve, cria uma entidade pra representar essa tabela, aí você pode deletar, pois é uma tabela que possui as duas foreign keys, é o lado fraco, ou seja, pode ser excluída sem problemas.