Como fazer relacionamento muitos para muitos com campos adicionais no jpa com hibernate

Olá pessoal gostaria que alguém pudesse me ajudar na questão de criar um relacionamento muitos para muitos com campos adicionais, segui um exemplo na internet porém não está funcionando, irei postar os códigos aqui.

@Entity
@Table(name = “remessas”)
public class Remessa implements Serializable, Entidade {

private static final long serialVersionUID = 1L;
private Long id;
private String nome;
private Long numeroSequencial;
private Integer quantidadeDownloads;
private Integer quantidadeTitulos;
private String textoArquivo;
private Double valorTitulo;
private List<NumeroDocumento> numerosDocumento;
private LocalDateTime criado;
@Override
@Id
@SequenceGenerator(name = "remessa_id_seq", sequenceName = "remessa_id_seq", allocationSize = 1, initialValue = 1)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "remessa_id_seq")
public Long getId() {
    return id;
}
@Override
public void setId(Long id) {
    this.id = id;
}
@Column(name = "nome", nullable = false, columnDefinition = "varchar(20)")
public String getNome() {
    return nome;
}
public void setNome(String nome) {
    this.nome = nome;
}
@Column(name = "numero_sequencial", nullable = true)
public Long getNumeroSequencial() {
    return numeroSequencial;
}
public void setNumeroSequencial(Long numeroSequencial) {
    this.numeroSequencial = numeroSequencial;
}
@Column(name = "quantidade_downloads", nullable = false)
public Integer getQuantidadeDownloads() {
    return quantidadeDownloads;
}
public void setQuantidadeDownloads(Integer quantidadeDownloads) {
    this.quantidadeDownloads = quantidadeDownloads;
}
@Column(name = "quantidade_titulos", nullable = false)
public Integer getQuantidadeTitulos() {
    return quantidadeTitulos;
}
public void setQuantidadeTitulos(Integer quantidadeTitulos) {
    this.quantidadeTitulos = quantidadeTitulos;
}
@Column(name = "texto_arquivo", nullable = false, columnDefinition = "text")
public String getTextoArquivo() {
    return textoArquivo;
}
public void setTextoArquivo(String textoArquivo) {
    this.textoArquivo = textoArquivo;
}
@Column(name = "valor_titulos", nullable = false, columnDefinition = "numeric(20,2)")
public Double getValorTitulo() {
    return valorTitulo;
}
public void setValorTitulo(Double valorTitulo) {
    this.valorTitulo = valorTitulo;
}
@OneToMany(mappedBy = "remessa")
public List<NumeroDocumento> getNumerosDocumento() {
    return numerosDocumento;
}
public void setNumerosDocumento(List<NumeroDocumento> numerosDocumento) {
    this.numerosDocumento = numerosDocumento;
}
@Convert(converter = LocalDateTimeConverter.class)
@Column(name = "criado", nullable = false, insertable = false, columnDefinition = "timestamp default now()")
public LocalDateTime getCriado() {
    return criado;
}
public void setCriado(LocalDateTime criado) {
    this.criado = criado;
}

}

@Entity
@Table(name = “numeros_documentos”)
public class NumeroDocumento implements Serializable, Entidade {

private static final long serialVersionUID = 1L;

private Long id;
private List<Remessa> remessas;

@Override
@Id
@SequenceGenerator(name = "numero_documento_id_seq", sequenceName = "numero_documento_id_seq", allocationSize = 1, initialValue = 1)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "numero_documento_id_seq")
public Long getId() {
    return id;
}
@Override
public void setId(Long id) {
    this.id = id;
}

@OneToMany(mappedBy = "numeroDocumento")
public List<Remessa> getRemessas() {
    return remessas;
}
public void setRemessas(List<Remessa> remessas) {
    this.remessas = remessas;
}

}

@Entity
@IdClass(RemessaNumeroDocumentoID.class)
public class RemessaNumeroDocumento {

private NumeroDocumento numeroDocumento;
private Remessa remessa;
private Double valorTitulo;
private Pagador pagador;
private LocalDate dataVencimento;
private LocalDateTime criado;

@Id
@ManyToOne
@JoinColumn(name = "remessa_id")
public Remessa getRemessa() {
    return remessa;
}
public void setRemessa(Remessa remessa) {
    this.remessa = remessa;
}

@Id
@ManyToOne
@JoinColumn(name = "numero_documento_id")
public NumeroDocumento getNumeroDocumento() {
    return numeroDocumento;
}
public void setNumeroDocumento(NumeroDocumento numeroDocumento) {
    this.numeroDocumento = numeroDocumento;
}

@Id
@ManyToOne
@JoinColumn(name = "pagador_id")
public Pagador getPagador() {
    return pagador;
}
public void setPagador(Pagador pagador) {
    this.pagador = pagador;
}

@Column(name = "valor_titulo", nullable = false, columnDefinition = "numeric(20,2)")
public Double getValorTitulo() {
    return valorTitulo;
}
public void setValorTitulo(Double valorTitulo) {
    this.valorTitulo = valorTitulo;
}

@Convert(converter = LocalDateConverter.class)
@Column(name = "data_vencimento", nullable = false, columnDefinition = "date")
public LocalDate getDataVencimento() {
    return dataVencimento;
}
public void setDataVencimento(LocalDate dataVencimento) {
    this.dataVencimento = dataVencimento;
}

@Convert(converter = LocalDateTimeConverter.class)
@Column(name = "criado", nullable = false, insertable = false, columnDefinition = "timestamp default now()")
public LocalDateTime getCriado() {
    return criado;
}
public void setCriado(LocalDateTime criado) {
    this.criado = criado;
}

}

public class RemessaNumeroDocumentoID implements Serializable {

private static final long serialVersionUID = 1L;

private Long remessa;
private Long numeroDocumento;

public RemessaNumeroDocumentoID() {
}

public RemessaNumeroDocumentoID(Long remessa, Long numeroDocumento) {
    this.remessa = remessa;
    this.numeroDocumento = numeroDocumento;
}

public Long getRemessa() {
    return remessa;
}
public void setRemessa(Long remessa) {
    this.remessa = remessa;
}

public Long getNumeroDocumento() {
    return numeroDocumento;
}
public void setNumeroDocumento(Long numeroDocumento) {
    this.numeroDocumento = numeroDocumento;
}

@Override
public boolean equals(Object o) {
    if (o instanceof RemessaNumeroDocumentoID) {
        RemessaNumeroDocumentoID remessaNumeroDocumentoID = (RemessaNumeroDocumentoID) o;
        return remessaNumeroDocumentoID.remessa == remessa && remessaNumeroDocumentoID.numeroDocumento == numeroDocumento;
    }
    return false;
}

@Override
public int hashCode() {
    return remessa.intValue() + numeroDocumento.intValue();
}

}

e esse é o erro que está acontecendo quando vou startar o servidor.

java.lang.Exception: {“WFLYCTL0080: Failed services” => {“jboss.persistenceunit.ROOT#r2boletos” => “org.jboss.msc.service.StartException in service jboss.persistenceunit.ROOT#r2boletos: org.hibernate.AnnotationException: mappedBy reference an unknown target entity property: br.com.r2soft.r2boletos.model.Remessa.numeroDocumento in br.com.r2soft.r2boletos.model.NumeroDocumento.remessas
Caused by: org.hibernate.AnnotationException: mappedBy reference an unknown target entity property: br.com.r2soft.r2boletos.model.Remessa.numeroDocumento in br.com.r2soft.r2boletos.model.NumeroDocumento.remessas”}}

ta ai pessoal esse é o código atual e esse é o erro que está acontecendo, o código seguiu a mesma coisa apresentada nesse tutorial que achei na net e tomei ele como base. Não posto o link do mesmo aqui pois não sei se as políticas do fórum permite. Se precisarem de mais detalhes só me avisarem.