1
resposta

Problema na deleção de registros da tabela associativa manytomany

Boa noite, estou com um problema no momento em que apago os registros da tabela associativa (manytomany). Pois, quando apago os filhos, o jpa automaticamente apaga os pais.

Tenho mapeada a classe perfil

@Entity

@Table(name = "perfil" , schema="dbo")
public class Perfil implements Serializable {

    //Mapenado classe PerfilFuncionalidade 
    @OneToMany(mappedBy = "perfil", fetch = FetchType.EAGER)
    Set<PerfilFuncionalidade> perfis;

}

Classe funcionalidade

@Entity
@Table(name = "funcionalidade" , schema="dbo")
public class Funcionalidade implements Serializable {

//Mapenado classe PerfilFuncionalidade 
    @OneToMany(mappedBy = "funcionalidade",fetch = FetchType.EAGER)
    Set<PerfilFuncionalidade> perfis;

}
Classe PerfilFuncionalidade
@Entity

@Table(name = "perfil_funcionalidade" , schema="dbo")
public class PerfilFuncionalidade implements Serializable {    

    //mapeando a classe funcionalidade
    @ManyToOne(fetch = FetchType.EAGER,  cascade=CascadeType.ALL)
    @JoinColumn(updatable=false,insertable=false,name = "id_funcionalidade")
    Funcionalidade funcionalidade;

    //mapeando a classe perfil 
    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(updatable=false,insertable=false,name = "id_perfil")
    Perfil perfil;

}
1 resposta

Oi Marcos!

Nesse seu exemplo não precisa criar a classe PerfilFuncionalidade, pois a tabela de join tem apenas as colunas id_perfil e id_funcionalidade. O ideal seria mapear assim:

@Entity
@Table(name = "perfil" , schema="dbo")
public class Perfil implements Serializable {

    @ManyToMany(cascade = {
        CascadeType.PERSIST,
        CascadeType.MERGE
    })
    @JoinTable(name = "perfil_funcionalidade",
        joinColumns = @JoinColumn(name = "perfil_id"),
        inverseJoinColumns = @JoinColumn(name = "funcionalidade_id")
    )
    private Set<Funcionalidade> funcionalidades = new HashSet<>();

    public void adicionarFuncionalidade(Funcionalidade funcionalidade) {
        funcionalidades.add(funcionalidade);
        funcionalidade.getPerfis().add(this);
    }

    public void removerFuncionalidade(Funcionalidade funcionalidade) {
        funcionalidades.remove(funcionalidade);
        funcionalidade.getPerfis().remove(this);
    }
}
@Entity
@Table(name = "funcionalidade" , schema="dbo")
public class Funcionalidade implements Serializable {

    @ManyToMany(mappedBy = "funcionalidades")
    private Set<Perfil> perfis = new HashSet<>();
}