1
resposta

Inserir Dados em uma lista de uma entidade com relacionamento ManyToMany

Boa noite. Eu teste na aplicação o relacionamento ManyToMany da classe Produto com a Classe Categoria. Ambas as classes tem o atributo do tipo List<> Ex.

public class categoria implements Serializable {
@ManyToMany(cascade=CascadeType.REFRESH, fetch=FetchType.LAZY, mappedBy="categorias")
    private List<Produto> produtos;
    .
    .
    .
}
public class Produto implements Serializable {

@ManyToMany
    @JoinTable(name = "ProdutoPrograma", joinColumns = @JoinColumn(name = "idProduto"), inverseJoinColumns = @JoinColumn(name = "idCategoria"))
    @Where(clause = "ativo=true")
    @OrderBy("nmCategoriaDeProduto")
    @NotNull
    private List<Categoria> categorias = new ArrayList<>();

.
.
.
}

Mas não consigo persistir os dados de categorias em produto. Se acesso o getCategoriasDeProduto.add para adicionar um novo objeto de categoria ocorre erro de LazyInitializationException. Como faço pra inserir os dados na lista das duas classes? Produto pode ter uma ou mais categorias e categorias pode ter um ou mais produtos. Agradeço se puderem me dá uma dica. Abraço

1 resposta

Oi Cesar,

Ao carregar um produto do banco de dados você vai precisar carregar junto a lista de categorias, via join fetch. E então vai conseguir adicionar a categoria.

Por exemplo:

//metodo na classe dao:
public Produto carregarComCategorias(Long id) {
    return em.createQuery("SELECT p FROM Produto p JOIN FETCH p.categorias", Produto.class).getSingleResult();
}

//exemplo de persistir relacionamento:
Produto produto = produtoDao.carregarComCategorias(1L);
Categoria categoria = categoriaDao.buscarPorId(1L);

//relacionamento bidirecional precisa setar a informacao nos dois lados:
produto.getCatergorias().add(categoria);
categoria.getProdutos().add(produto);