Ajuda em many-to-many com mais atributos

Galera seguinte to com um problema em um many to many com mais atributos

Segue a classe UsuarioHasSetorPK:

[code]package com.dto;

import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Id;

public class UsuarioSetorPK implements Serializable {

//private static final long serialVersionUID = -5869094934725857817l;
    
@Id
@Column(name="codigo_usuario", insertable=false, updatable=false)
private long id_usuario;

@Id
@Column(name="codigo_setor", insertable=false, updatable=false)
private long id_setor;

public UsuarioSetorPK(){
    super();
}

@Override
public boolean equals(Object o) {
    return super.equals(o);
}

@Override
public int hashCode() {
    return super.hashCode();
}

public Long getId_usuario() {
    return id_usuario;
}

public void setId_usuario(long id_usuario) {
    this.id_usuario = id_usuario;
}

public Long getId_setor() {
    return id_setor;
}

public void setId_setor(long id_setor) {
    this.id_setor = id_setor;
}

}
[/code]

A classe UsuarioSetorDTO

[code]
package com.dto;

import javax.persistence.*;

@Entity
@Table(name=“usuario_setor”)
@IdClass(UsuarioSetorPK.class)
public class UsuarioSetorDTO {

@Id
@Column(name="codigo_usuario", insertable=false, updatable=false)
private long id_usuario;

@Id
@Column(name="codigo_setor", insertable=false, updatable=false)
private long id_setor;

@ManyToOne(cascade= CascadeType.ALL)
@JoinColumn(name="codigo_usuario")
private UsuarioDTO usuarioDTO;

@ManyToOne(cascade= CascadeType.ALL)
@JoinColumn(name="codigo_setor")
private SetorDTO setorDTO;

@Column(name = "permissao")
private int permissao;

public UsuarioSetorDTO() {
    super();
    this.id_setor = 0l;
    this.id_usuario = 0l;
}

public UsuarioSetorDTO(long codigo_usuario, long codigo_setor) {
    super();
}



public UsuarioDTO getUsuarioDTO() {
    return usuarioDTO;
}

public void setUsuarioDTO(UsuarioDTO usuarioDTO) {
    this.usuarioDTO = usuarioDTO;
}

public SetorDTO getSetorDTO() {
    return setorDTO;
}

public void setSetorDTO(SetorDTO setorDTO) {
    this.setorDTO = setorDTO;
}

public int getPermissao() {
    return permissao;
}

public void setPermissao(int permissao) {
    this.permissao = permissao;
}

public Long getId_usuario() {
    return id_usuario;
}

public void setId_usuario(long id_usuario) {
    this.id_usuario = id_usuario;
}

public Long getId_setor() {
    return id_setor;
}

public void setId_setor(long id_setor) {
    this.id_setor = id_setor;
}

}[/code]

O teste:

[code] UsuarioBO usuarioBO = new UsuarioBO();
SetorBO setorBO = new SetorBO();
UsuarioSetorBO usuarioSetorBO = new UsuarioSetorBO();
UsuarioSetorDTO usuarioSetorDTO = new UsuarioSetorDTO();
UsuarioDTO usuarioDTO = usuarioBO.findById(4l);
SetorDTO setorDTO = setorBO.findById(2l);

    usuarioSetorDTO.setUsuarioDTO(usuarioDTO);
    usuarioSetorDTO.setSetorDTO(setorDTO);  
    usuarioSetorBO.save(usuarioSetorDTO);[/code]

o Erro:

could not bind value ‘0’ to parameter: 4;
O indice da coluna está fora do intervalo: 4, número de colunas 3