Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Problema com EmbeddedId

Estou com o mesmo erro do Guilherme, no tópico fechado abaixo, porém quando gerei a criação do HashCode e equals passou a dar outro erro no EmbeddedId O código ficou assim:

package br.com.alura.loja.modelo;

import java.util.Objects;

import javax.persistence.Embeddable;

@Embeddable
public class CategoriaId {
    private String nome;
    private String tipo;

    public CategoriaId(String nome, String tipo) {
        this.nome = nome;
        this.tipo = tipo;
    }

    public CategoriaId() {

    }

    @Override
    public int hashCode() {
        return Objects.hash(nome, tipo);
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        CategoriaId other = (CategoriaId) obj;
        return Objects.equals(nome, other.nome) && Objects.equals(tipo, other.tipo);
    }

    public String getNome() {
        return nome;
    }

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

    public String getTipo() {
        return tipo;
    }

    public void setTipo(String tipo) {
        this.tipo = tipo;
    }

}

E este é o erro que esta dando:

INFO: HHH000115: Hibernate connection pool size: 20 (min=1)
mai. 25, 2022 1:59:29 PM org.hibernate.dialect.Dialect <init>
INFO: HHH000400: Using dialect: org.hibernate.dialect.MySQL8Dialect
Exception in thread "main" java.lang.ExceptionInInitializerError
    at br.com.alura.testes.CadastroDeProduto.Cadastrar(CadastroDeProduto.java:48)
    at br.com.alura.testes.CadastroDeProduto.main(CadastroDeProduto.java:19)
Caused by: javax.persistence.PersistenceException: [PersistenceUnit: loja] Unable to build Hibernate SessionFactory
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.persistenceException(EntityManagerFactoryBuilderImpl.java:1336)
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1262)
    at org.hibernate.jpa.HibernatePersistenceProvider.createEntityManagerFactory(HibernatePersistenceProvider.java:56)
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:79)
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:54)
    at br.com.alura.loja.util.JPAutil.<clinit>(JPAutil.java:8)
    ... 2 more
Caused by: org.hibernate.MappingException: Composite-id class must implement Serializable: br.com.alura.loja.modelo.CategoriaId
    at org.hibernate.mapping.RootClass.checkCompositeIdentifier(RootClass.java:293)
    at org.hibernate.mapping.RootClass.validate(RootClass.java:276)
    at org.hibernate.boot.internal.MetadataImpl.validate(MetadataImpl.java:354)
    at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:465)
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1259)
    ... 6 more

Insira aqui a descrição dessa imagem para ajudar na acessibilidadeParece que este erro afetou meu pom.xml:

Segue aqui o código Categoria :

package br.com.alura.loja.modelo;

import javax.persistence.EmbeddedId;
import javax.persistence.Entity;
import javax.persistence.Table;

@Entity
@Table(name = "categorias")
public class Categoria {
//    @Id
//    @GeneratedValue(strategy = GenerationType.IDENTITY)
//    private Long id;

    @EmbeddedId
    private CategoriaId id;

    public Categoria() {
        super();
    }

    public String getNome() {
        return this.id.getNome();
    }

    public Categoria(String nome) {
        this.id = new CategoriaId(nome, "tipo");
    }

}
1 resposta
solução!

O erro foi corrigido colocando ** implements Serializable ** na classe CategoriaId

package br.com.alura.loja.modelo;

import java.io.Serializable;
import java.util.Objects;

import javax.persistence.Embeddable;

@Embeddable
public class CategoriaId implements Serializable{
    private String nome;
    private String tipo;

    public CategoriaId(String nome, String tipo) {
        this.nome = nome;
        this.tipo = tipo;
    }

    public CategoriaId() {

    }

    @Override
    public int hashCode() {
        return Objects.hash(nome, tipo);
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        CategoriaId other = (CategoriaId) obj;
        return Objects.equals(nome, other.nome) && Objects.equals(tipo, other.tipo);
    }

    public String getNome() {
        return nome;
    }

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

    public String getTipo() {
        return tipo;
    }

    public void setTipo(String tipo) {
        this.tipo = tipo;
    }

}