Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

12
respostas

Atributo categorias

Bom dia. Alterei a minha classe de modelo e adicionei o atributo categorias, como foi visto na aula, porem o hibernate nao gerou esse campo no banco de dados, entao minha consulta pela categoria volta sempre nula. Segue o codigo :

@ManyToMany
    @JoinTable(name="PRODUTO_CATEGORIA")
    private List<Categoria> categorias = new ArrayList<>();

Obrigado

12 respostas

Andrey, certifique-se de que, no seu arquivo peristence.xml, a propriedade hibernate.hbm2ddl.auto está com o valor auto.

Assim:

<property name="hibernate.hbm2ddl.auto" value="update" />

Reinicie seu servidor de aplicação e tente novamente.

Se não der certo e caso seja possível, a base e crie novamente (ou, pelo menos, as tabelas que estão relacionadas: Categoria e quem mais se relacionar com ela).

Testa e dá um retorno.

Abraço.

Obrigado pela resposta. Verifiquei o persistence.xml, e o valor da propriedade estava "create-drop", alterei para update e nao deu certo. Apaguei todas tabelas do banco e reiniciei o tomcat, todas foram geradas novamente, mas sem o campo categorias em especifico. Alguma dica ?

por favor uma ajuda aqui

Andrey, posta tuas classes Produto e Categoria.

classe Produto


package br.com.caelum.model;

import java.util.ArrayList;
import java.util.List;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.validation.Valid;
import javax.validation.constraints.Min;

import org.hibernate.validator.constraints.NotEmpty;

@Entity
public class Produto {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;
    @NotEmpty
    private String nome;
    @NotEmpty
    private String linkDaFoto;

    @NotEmpty
    @Column(columnDefinition="TEXT")
    private String descricao;

    @Min(20)
    private double preco;

    @ManyToMany
    private List<Categoria> categorias = new ArrayList<>();    

    @Valid
    @ManyToOne
    private Loja loja;


    public String getDescricao() {
        return descricao;
    }

    public void setDescricao(String descricao) {
        this.descricao = descricao;
    }

    //método auxiliar para associar categorias com o produto
    //se funcionar apos ter definido o relacionamento entre produto e categoria
//    public void adicionarCategorias(Categoria... categorias) {
//        for (Categoria categoria : categorias) {
//            this.categorias.add(categoria);
//        }
//    }

    public String getLinkDaFoto() {
        return linkDaFoto;
    }

    public double getPreco() {
        return preco;
    }

    public void setPreco(double preco) {
        this.preco = preco;
    }

    public void setLinkDaFoto(String linkDaFoto) {
        this.linkDaFoto = linkDaFoto;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public Integer getId() {
        return id;
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public void setLoja(Loja loja) {
        this.loja = loja;
    }

    public Loja getLoja() {
        return loja;
    }

    public List<Categoria> getCategorias() {
        return categorias;
    }

    public void setCategorias(List<Categoria> categorias) {
        this.categorias = categorias;
    }

}

Classe Categorias

package br.com.caelum.model;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity
public class Categoria {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;
    private String nome;

    public Categoria(String nome) {
        this.nome = nome;
    }

    public Categoria() { 

    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getNome() {
        return nome;
    }

}

Andrey, quando você anota com @ManyToMany significa que é um relacionamento M:N. Isso você já deve saber. Na prática, o hibernate cria uma terceira tabela, chamada PRODUTO_CATEGORIA (você deu esse nome pra ela ao anotar com @JoinTable(name="PRODUTO_CATEGORIA").

Dá uma olhada nessa tabela (PRODUTO_CATEGORIA), nela devem constar dois atributos: categoria_id e produto_id. É nessa tabela que fica salvo todo relacionamento entre os produtos e as respectivas categorias.

sim Manoel, eu ja havia feito isso, e fiz agora novamente, que leva ao problema que a query do criteria nao retorna nada, pode dar uma olhada pra mim por favor?

public List<Produto> getProdutos(String nome, Integer categoriaId, Integer lojaId) {
        CriteriaBuilder criteriaBuilder = em.getCriteriaBuilder();
        CriteriaQuery<Produto> query = criteriaBuilder.createQuery(Produto.class);

        Root<Produto> root = query.from(Produto.class);

        Path<String> nomePath = root.<String>get("nome");
        Path<Integer> lojaPath = root.<Loja>get("loja").<Integer>get("id");
        Path<Integer> categoriaPath = root.join("categorias").<Integer>get("id");

        List<Predicate> predicates = new ArrayList<>();

        if(!nome.isEmpty()){
            Predicate nomeIgual = criteriaBuilder.like(nomePath, nome);
            predicates.add(nomeIgual);
        }
        if(categoriaId != null){
            Predicate categoriaIgual = criteriaBuilder.equal(categoriaPath, categoriaId);
            predicates.add(categoriaIgual);
        }
        if(lojaId != null){
            Predicate lojaIgual = criteriaBuilder.equal(lojaPath, lojaId);
            predicates.add(lojaIgual);
        }

        query.where((Predicate[]) predicates.toArray(new Predicate[0]));

        TypedQuery<Produto> typedQuery = em.createQuery(query);

        return typedQuery.getResultList();

    }

Obrigado

Alguém por favor

Olá Andrey, conseguiu resolver ?, eu também estou com o mesmo erro e mesmo setando o valor, faz 2 meses e ninguém respondeu ainda ?

props.setProperty("hibernate.hbm2ddl.auto", "update");

continua sem atualizar a tabela.

Boa tarde Thiago, nada ainda...eu nem sei como resolver isso, ai baixei o projeto do final do curso e funcionou, mas não consegui resolver o problema. Faz isso tbm

Obrigado Andrey, não sei se você consegue marcar esse tópico como "não resolvido", eu marcaria, acho que algum professor poderia nos explicar melhor a causar disso, valeu.

Obrigado Thiago, eu não tenho mais essa opção aqui pelo post ser bem antigo