Relacionamento ManyToMany gravando errado

Bom dia pessoal, tenho uma entidade tipoProtocolo,tipoDocumento que se relacionam N:N através da tabela tipodocumentotipoprotocolo;
o que deveria acontecer era, escolho o tipoProtocolo, associo os tiposDocumentos, e ao atualizar o tipoProtocolo, ele gravar na tabela tipodocumentotipoprotocolo, ou seja, as alterações deveriam ser só em tipodocumentotipoprotocolo, só q está acontecendo o seguinte: quando atualizo, 2 campos boolean do registro de tipoProtocolo são apagados, são inserido novos registros(os que foram associados) na tabela tipoDocumentos, além de gravar na tabela tipodocumentotipoprotocolo(correto). Segue abaixo as entidades:

[code]@Entity
public class TipoProtocolo implements Serializable {

private static final long serialVersionUID = 1L;
// ATRIBUTOS
private Long idTipoProtocolo;
private String descricao;
private Boolean ativo;
private Boolean rotaLivre;
//RELACIONAMENTOS UM PARA MUITOS
private List<Protocolo> protocolos;
//RELACIONAMENTOS MUITOS PARA MUITOS
private List<TipoDocumento> tiposDocumentos;

// CONSTRUTORES
// Construtor Padrão
public TipoProtocolo() {
}

public TipoProtocolo(Long idTipoProtocolo, String descricao) {
    this.idTipoProtocolo = idTipoProtocolo;
    this.descricao = descricao;
}

//GETTERS E SETTERS
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
public Long getIdTipoProtocolo() {
    return idTipoProtocolo;
}

public void setIdTipoProtocolo(Long idTipoProtocolo) {
    this.idTipoProtocolo = idTipoProtocolo;
}

public Boolean getAtivo() {
    return ativo;
}

public void setAtivo(Boolean ativo) {
    this.ativo = ativo;
}

public Boolean getRotaLivre() {
    return rotaLivre;
}

public void setRotaLivre(Boolean rotaLivre) {
    this.rotaLivre = rotaLivre;
}

@Column(length = 80)
public String getDescricao() {
    return descricao;
}

public void setDescricao(String descricao) {
    this.descricao = descricao;
}

@OneToMany(mappedBy = "tipoProtocolo")
public List<Protocolo> getProtocolos() {
    if (this.protocolos == null) {
        this.protocolos = new ArrayList<Protocolo>();
        Hibernate.initialize(protocolos);
    }
    return protocolos;
}

public void setProtocolos(List<Protocolo> protocolos) {
    this.protocolos = protocolos;
}

@ManyToMany(cascade={CascadeType.MERGE })
@JoinTable(name = "tipodocumentotipoprotocolo", joinColumns = {
    @JoinColumn(name = "idTipoProtocolo",
    referencedColumnName = "idTipoProtocolo")},
inverseJoinColumns = {
    @JoinColumn(name = "idTipoDocumento",
    referencedColumnName = "idTipoDocumento")
})
public List<TipoDocumento> getTiposDocumentos() {
    return tiposDocumentos;
}

public void setTiposDocumentos(List<TipoDocumento> tiposDocumentos) {
    this.tiposDocumentos = tiposDocumentos;
}

[/code]

[code]@Entity
public class TipoDocumento implements Serializable {

/**
 *
 */
private static final long serialVersionUID = 1L;
// ATRIBUTOS
private Long idTipoDocumento;
private String descricao;
// RELACIONAMENTOS MUITOS PARA MUITOS
private List<TipoProtocolo> tiposProtocolos;

// CONSTRUTORES
// Construtor Padrão
public TipoDocumento() {
}

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
public Long getIdTipoDocumento() {
    return idTipoDocumento;
}

public void setIdTipoDocumento(Long idDocumento) {
    this.idTipoDocumento = idDocumento;
}

@Column(length = 100, nullable = false)
public String getDescricao() {
    return descricao;
}

public void setDescricao(String descricao) {
    this.descricao = descricao;
}

@ManyToMany(mappedBy = "tiposDocumentos")
public List<TipoProtocolo> getTiposProtocolos() {
    return tiposProtocolos;
}

public void setTiposProtocolos(List<TipoProtocolo> tiposProtocolos) {
    this.tiposProtocolos = tiposProtocolos;
}

[/code]

[code]@ManagedBean(name = “documentoProtocoloController”)
@ViewScoped
public class DocumentoProtocoloController implements Serializable {
.
.
.
private void prepareAdicionar() {
listaTiposDocumentos = tipoProtocolo.getTiposDocumentos();
List source = tipoDocumentoDao.listPesq(“SELECT t FROM TipoDocumento t ORDER BY t.descricao”);
List target = new ArrayList();
if (listaTiposDocumentos != null && listaTiposDocumentos.size() > 0) {
for (TipoDocumento td : listaTiposDocumentos) {
target.add(td);
}
}
tiposDocumentos = new DualListModel(source, target);
this.setCurrentState(StateConstante.ADICIONAR_STATE);

}

/**
 * Adicionar
 */
public void adicionar() {
    tipoProtocolo.setTiposDocumentos(tiposDocumentos.getTarget());
    tipoProtocoloDao.atualizar(tipoProtocolo);
    FacesUtils.mensInfo("Cadastro de Documentos efetuado com sucesso!");
    prepareAdicionar();
}

}
[/code]

cara,

se sua tabela de ligacão N:N tem mais atributos que as chaves estrageiras, vc tem que criar uma entidade para essa tabela. de uma pesquisa no guj, q tem varios post em relação a esse assunto.

t+