Problemas com JPA (relacionamento N x M)

2 respostas
toni.arc

Fala pessoal, tudo bem?

estou tentando persistir dois objetos que tem um relacionamento de N X M da seguinte maneira:

@Entity
@Table(name = "P_PERMISSOES")
public class Permissoes implements Serializable {

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name = "ID_PERMISSAO", nullable = false)
    private Integer idPermissao;

    @Column(name = "PAGINA", nullable = false)
    private String pagina;

    private String descricao;
    
    @ManyToMany
    @JoinTable(name="P_PADRAO_ACESSO_PERMISSAO", 
        inverseJoinColumns={
            @JoinColumn(name="ID_PADRAO_ACESSO")}, 
        joinColumns={
            @JoinColumn(name="ID_PERMISSAO")})
    private List<PadroesAcesso> padroesAcesso;

   //getters e setters omitidos
}
@Entity
@Table(name = "P_PADRAO_ACESSO")
public class PadraoAcesso implements Serializable {

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name = "ID_PADRAO_ACESSO", nullable = false)
    private Integer idPadraoAcesso;

    @Column(name = "DESCRICAO", unique=true)
    private String descricao;

    @ManyToMany(mappedBy="padroesAcesso", cascade= {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH})
    private List<Permissoes> permissoes;
    //getters e setters omitidos
}

O código a seguir é onde eu armazenando o objeto

@Stateless
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public class PadraoAcessoBean implements PadraoAcessoLocal {
    
    @PersistenceContext(unitName="protocoloPU")
    private EntityManager em;

     ......

     public void insert(PadraoAcesso pa, Permissoes[] permissoes){
        
        List<Permissoes> p = new ArrayList<Permissoes>();
        
        for(int i =0; i < permissoes.length; i++){
            Permissoes permissao = em.find(Permissoes.class, permissoes[i].getIdPermissao());
            p.add(permissao);
        }
        
        pa.setPermissoes(p);
        
        em.persist(pa);
    }

     .....
}

esse código insere tanto os registros da tabela P_PADRAO_ACESSO quanto da tabela P_PADRAO_ACESSO_PERMISSAO normalmente, o problema é que quanto eu tento inserir um novo registro ele insere na tabela P_PADRAO_ACESSO mas na tabela de associação (P_PADRAO_ACESSO_PERMISSAO) é como se ele apagasse tudo o que ja estava armazenado na mesma e armazenasse somente as informações do novo registro.

Alguem tem alguma idéia de como resolver isso?

Desde ja obrigado!!!

2 Respostas

Paulo_Silveira

VOce esta alterando o lado do relacionamento “mappedBy”. Tudo que é feito nesse lado do relacionamento nao é levado em conta para escrita… (vide spec) voce tem de setar o PA do Permission, em vez do contrario.

Ou entao troca o mappedBy de lugar, que ai vai funcionar direto. (poe mappedBy=“permissoes” na List definido em Permissao, e tira o mappedBy do outro) . Pode ser que outras coisas que funcionavam parem de funcionar…

toni.arc

Obrigado pela resposta, funcionou perfeito agora. :smiley:

Criado 14 de agosto de 2007
Ultima resposta 16 de ago. de 2007
Respostas 2
Participantes 2