JPA - JoinTable many to many - Insere somente 1 dado

Ola amigos,

Estou com uma dificuldade ao realizar o “insert”. Estou tentando inserir varias linhas em uma tabela com relacionamento manyToMany porem ele insere somente 1 linha e não repete.

Alguma sugestão ?

segue minhas classes com as anotaçoes:

Classe produto {.  
    ....
    @JoinTable(name = "VENDAS_PRODUTOS", joinColumns = {
        @JoinColumn(name = "idProduto", referencedColumnName = "idProduto")}, inverseJoinColumns = {
        @JoinColumn(name = "idVenda", referencedColumnName = "idVenda")})
    @ManyToMany
    private List<Vendas> vendasList;
    .....
}

classe vendas {
...
  @ManyToMany(mappedBy = "vendasList")
    private List<Produtos> produtosList;
....
}

Cara, o mapeamento parece estar ok. Agora, como está fazendo este insert?

public void create(Vendas vendas) throws PreexistingEntityException, Exception {
        if (vendas.getProdutosList() == null) {
            vendas.setProdutosList(new ArrayList<Produtos>());
        }
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Funcionarios idVendedor = vendas.getIdVendedor();
            if (idVendedor != null) {
                idVendedor = em.getReference(idVendedor.getClass(), idVendedor.getIdFun());
                vendas.setIdVendedor(idVendedor);
            }
            List<Produtos> attachedProdutosList = new ArrayList<Produtos>();
            for (Produtos produtosListProdutosToAttach : vendas.getProdutosList()) {
                produtosListProdutosToAttach = em.getReference(produtosListProdutosToAttach.getClass(), produtosListProdutosToAttach.getIdProduto());
                attachedProdutosList.add(produtosListProdutosToAttach);
            }
            vendas.setProdutosList(attachedProdutosList);
            em.persist(vendas);
            if (idVendedor != null) {
                idVendedor.getVendasList().add(vendas);
                idVendedor = em.merge(idVendedor);
            }
            for (Produtos produtosListProdutos : vendas.getProdutosList()) {
                produtosListProdutos.getVendasList().add(vendas);
                produtosListProdutos = em.merge(produtosListProdutos);
            }
            em.getTransaction().commit();
        } catch (Exception ex) {
            if (findVendas(vendas.getIdVenda()) != null) {
                throw new PreexistingEntityException("Vendas " + vendas + " already exists.", ex);
            }
            throw ex;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

Deixa eu fazer algumas observações pertinentes.
Embora você realmente não precise de uma estrutura específica, como um DAO, por exemplo, o ideal seria manter isolados a lógica do negócio (as regras em si, como os ifs) e a parte de persistência. Lembre-se do princípio da responsabilidade única (baixo acoplamento e alta coesão devem ter algum sentido para ti e não serem, apenas, palavras de efeito).

Outro ponto, embora você possa nomear tuas classes da maneira que melhor lhe convir ou quiser, nomes de classes, em geral, devem ser auto explicativos e, normalmente, no singular. Vendas é um nome no plural que, a primeira vista, me traz a impressão de tratar-se de uma lista de vendas, ou seja, um atributo de alguma outra classe que contenha várias vendas (comissão? vendedor? loja? não sei).

Embora teu código esteja confuso e tenha estes aspectos a melhorar, não vejo razão para inserir apenas um item.
O ideal é rodar em debug e verificar se as informações estão sendo inseridas corretamente nos locais onde você espera isso.

Muito Obrigado Pela dicas… sou iniciante no JPA…Valew por responder !!!