Relacionamento ManyToMany gravando errado

1 resposta
F

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:

@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;
    }
@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;
    }
@ManagedBean(name = "documentoProtocoloController")
@ViewScoped
public class DocumentoProtocoloController implements Serializable {
	.
	.
	.
    private void prepareAdicionar() {
        listaTiposDocumentos = tipoProtocolo.getTiposDocumentos();
        List<TipoDocumento> source = tipoDocumentoDao.listPesq("SELECT t FROM TipoDocumento t ORDER BY t.descricao");
        List<TipoDocumento> target = new ArrayList<TipoDocumento>();
        if (listaTiposDocumentos != null && listaTiposDocumentos.size() > 0) {
            for (TipoDocumento td : listaTiposDocumentos) {
                target.add(td);
            }
        }
        tiposDocumentos = new DualListModel<TipoDocumento>(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();
    }
}

1 Resposta

A

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+

Criado 4 de outubro de 2011
Ultima resposta 4 de out. de 2011
Respostas 1
Participantes 2