Ainda não tem acesso? Estude com a gente! Matricule-se
Ainda não tem acesso? Estude com a gente! Matricule-se

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