[Resolvido]@ManyToMany não remove item (Hibernate JPA2)

Fala ae galerinha do mal! ultimamente estou com uma boa dor de cabeça em um relacionamento Many-To-Many com os Id @embedded, eu tenho o relacionamento entre Usuario e Ocorrencias gerando a minha tabela OcorrenciaUsuarios, eu consigo adicionar porem excluir ta complicado…

Usuario

  @OneToMany(orphanRemoval=true,fetch= FetchType.LAZY,mappedBy="ocorrenciaUsuarioPK.usuario")
    @Cascade({org.hibernate.annotations.CascadeType.SAVE_UPDATE, org.hibernate.annotations.CascadeType.DELETE_ORPHAN})
    private List<OcorrenciaUsuario> ocorrenciasUsuarios = new ArrayList<OcorrenciaUsuario>();

Ocorrencia

@OneToMany(orphanRemoval=true,fetch = FetchType.LAZY, mappedBy = "ocorrenciaComponentePK.ocorrencia")
    @Cascade({org.hibernate.annotations.CascadeType.SAVE_UPDATE, org.hibernate.annotations.CascadeType.DELETE_ORPHAN})
    private List<OcorrenciaComponente> ocorrenciaComponentes = new ArrayList<OcorrenciaComponente>();

OcorrenciaUsuario

@Entity
public class OcorrenciaUsuario implements Serializable {

    @EmbeddedId
    private OcorrenciaUsuarioPK ocorrenciaUsuarioPK = new OcorrenciaUsuarioPK();
   
    @Transient
    private Ocorrencia ocorrencia;
    @Transient
    private Usuario usuario;

    public Ocorrencia getOcorrencia() {
        return ocorrenciaUsuarioPK.getOcorrencia();
    }

    public Usuario getUsuario() {
        return ocorrenciaUsuarioPK.getUsuario();
    }

    public void setOcorrencia(Ocorrencia ocorrencia) {
        ocorrenciaUsuarioPK.setOcorrencia(ocorrencia);
    }
    public void setUsuario(Usuario usuario) {
        ocorrenciaUsuarioPK.setUsuario(usuario);
    } 

    public OcorrenciaUsuarioPK getOcorrenciaUsuarioPK() {
        return ocorrenciaUsuarioPK;
    }

    public void setOcorrenciaUsuarioPK(OcorrenciaUsuarioPK ocorrenciaUsuarioPK) {
        this.ocorrenciaUsuarioPK = ocorrenciaUsuarioPK;
    }

    
}

OcorrenciaUsuarioPK

@Embeddable
@Table(schema = "teste2")
public class OcorrenciaUsuarioPK implements Serializable {

    @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.REFRESH)
    @JoinColumn(name = "username")
    private Usuario usuario;
    
    @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.REFRESH)
    @JoinColumn(name = "id")
    private Ocorrencia ocorrencia;

    public Ocorrencia getOcorrencia() {
        return ocorrencia;
    }

    public void setOcorrencia(Ocorrencia ocorrencia) {
        this.ocorrencia = ocorrencia;
    }

    public Usuario getUsuario() {
        return usuario;
    }

    public void setUsuario(Usuario usuario) {
        this.usuario = usuario;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final OcorrenciaUsuarioPK other = (OcorrenciaUsuarioPK) obj;
        if (this.ocorrencia != other.ocorrencia && (this.ocorrencia == null || !this.ocorrencia.equals(other.ocorrencia))) {
            return false;
        }
        if (this.usuario != other.usuario && (this.usuario == null || !this.usuario.equals(other.usuario))) {
            return false;
        }
        return true;
    }

    @Override
    public int hashCode() {
        int hash = 3;
        hash = 47 * hash + (this.ocorrencia != null ? this.ocorrencia.hashCode() : 0);
        hash = 47 * hash + (this.usuario != null ? this.usuario.hashCode() : 0);
        return hash;
    }
}

Alguém pode me ajudar??? to ficando louco ja…

Vixi cara, escrevi no tópico errado, foi mal ai. :oops:

Que isso cara sem problemas :smiley: ! Alguem?? :?

Se ao excluir um é para excluir o outro pq você ñ tenta com o DELETE ao invés do DELETE_ORPHAN?

fiz o procedimento, e nada aconteceu! Não sei se deixei bem claro mais eu preciso excluir a associação… ou seja, remover a ocorrencia e o usuario da minha ManyToMany

Mas você está excluindo da ponta que você configurou o DELETE?

uhum tipo, eu na verdade não estou excluindo e sim alterando … estou utilizando o multiple auto complete do primefaces… ai eu removo um usuario da minha lista e essa lista teria que ser persistida, atualizando as informações porem nada acontece…

Metodo Salvar

 public void gravar(ActionEvent event) throws Exception {
        for (Usuario usua : usuariosSelecionados) {
            System.out.println("-----" + usua.getUsername());
            OcorrenciaUsuario oco = new OcorrenciaUsuario();
            oco.setUsuario(usua);
            oco.setOcorrencia(ocorrencia);
             ocos.add(oco);
   
        }
        ocorrencia.setOcorrenciasUsuarios(ocos);
        ocorrenciaFacade.salvar(ocorrencia);
 

    }

AutoComplete

  <p:autoComplete value="#{fecharOcorrenciaBean.usuariosSelecionados}" completeMethod="#{fecharOcorrenciaBean.complete}" multiple="true"
                                    var="us" itemLabel="#{us.username}" itemValue="#{us}" converter="usuario"  size="10">
                        <p:ajax event="itemUnselect" listener="#{fecharOcorrenciaBean.removeUsuarioOcorrencia}" update=":ocorrenciaForm" />  
                        <p:column>
                            #{us.username} - #{us.nome}
                        </p:column>
                    </p:autoComplete>

estou utilizando o itemUnselect com o evento UnselectEvent apenas para identificar qual usuario estou removendo… mais algo insignificante ja que o p:autoComplete ja remove de forma nativa os usuarios tirados da lista

Amigo vc esta usando JPA ou Hibernate??
Se for JPA com vc quer usar o Cascata de Hibernate???

segundo o JPA tem uma propriedade na annotation

@OneToMany que serve para isso…
orphanRemoval

Foi mal me confundi… to usando JPA

Alguem?..

Deu Certo??

Ele ja está com a propriedade Cascade no annotaiton… não deu certo ainda ;x… ele não remove item na ManyToMany… apenas insere…

Seguinte da forma q esta mapeado vc esta com OneToMany…
nas duas pontas…
vc queria um ManyToMany que nao eh mapeado assimm…

o OneToMany como usa o mappedBy ele nao consegue remover.

Caro, quando se utiliza OneToMany nas duas pontas gera automaticamente a associação, lembra da regrinha de relacionamento 1 – * com 1 – * gera a ManyToMany… creio que não esteja errado pois o mapeamento foi feito segundo a regra de EmbeddedId do Hibernate, mais vou tentar utilizar a ManyToMany para verificar se fiz alguma caca :smiley: Vlw…

Pessoal na verdade meu mapeamento estava certo… oque fiz foi remover no código mesmo…

[code]
public void removeUsuarioOcorrencia(UnselectEvent event) {
usuario = (Usuario) event.getObject();

    OcorrenciaUsuario oco = new OcorrenciaUsuario();
    OcorrenciaUsuarioPK ocopk = new OcorrenciaUsuarioPK();
    ocopk.setOcorrencia(ocorrencia);
    ocopk.setUsuario(usuario);
    oco.setOcorrenciaUsuarioPK(ocopk);

    ocorrenciaUsuarioFacade.remove(oco);

}[/code]

Qualquer duvida estarei a disposição :smiley:

Para futuras pessoas que procurarem, hoje ao ler o livro de JPA achei um material muito importante. Espero que venha a ajudar outros:

Muito bom :smiley: meu relacionamento partiu desta pagina huahuahuhuauaa só retirei algumas premissas, mais enfim! caso alguém tiver dificuldade é só avisar :stuck_out_tongue:

estou com esse problema e ainda não consegui resolver mesmo usando orphanRemoval=true