1
resposta

[Dúvida] Produto produto = em.find(Produto.class, 1l);

Neste código:

public class CadastroDeProduto {

    public static void main(String[] args) {
        EntityManager em = JPAUtil.getEntityManager();

        Produto produto = em.find(Produto.class, 1);
        produto.setDesc("Teste 1");
        em.flush();
        em.clear();
        produto.setDesc("Teste 2");
        em.merge(produto);
        produto.setDesc("Teste 3");
        em.getTransaction().commit();
        em.close();
    }
}

O que está acontecendo nesta linha? Produto produto = em.find(Produto.class, 1); Pois na minha maquina ele retorna isso:

INFO: HHH000204: Processing PersistenceUnitInfo [name: loja]
nov 21, 2022 4:42:27 PM org.hibernate.Version logVersion
INFO: HHH000412: Hibernate ORM core version 5.4.27.Final
nov 21, 2022 4:42:27 PM org.hibernate.annotations.common.reflection.java.JavaReflectionManager <clinit>
INFO: HCANN000001: Hibernate Commons Annotations {5.1.2.Final}
nov 21, 2022 4:42:28 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure
WARN: HHH10001002: Using Hibernate built-in connection pool (not for production use!)
nov 21, 2022 4:42:28 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH10001005: using driver [org.h2.Driver] at URL [jdbc:h2:mem:loja]
nov 21, 2022 4:42:28 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH10001001: Connection properties: {password=****, user=root}
nov 21, 2022 4:42:28 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH10001003: Autocommit mode: false
nov 21, 2022 4:42:28 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl$PooledConnections <init>
INFO: HHH000115: Hibernate connection pool size: 20 (min=1)
nov 21, 2022 4:42:28 PM org.hibernate.dialect.Dialect <init>
INFO: HHH000400: Using dialect: org.hibernate.dialect.H2Dialect
nov 21, 2022 4:42:29 PM org.hibernate.resource.transaction.backend.jdbc.internal.DdlTransactionIsolatorNonJtaImpl getIsolatedConnection
INFO: HHH10001501: Connection obtained from JdbcConnectionAccess [org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator$ConnectionProviderJdbcConnectionAccess@45acdd11] for (non-JTA) DDL execution was not in auto-commit mode; the Connection 'local transaction' will be committed and the Connection will be set into auto-commit mode.

Hibernate: create table categorias (id bigint generated by default as identity, nome varchar(255), primary key (id))
Hibernate: create table produtos (id bigint generated by default as identity, dataCadastro date, descricao varchar(255), nome varchar(255), preco decimal(19,2), categoria_id bigint, primary key (id))
Hibernate: alter table produtos add constraint FK8rqw0ljwdaom34jr2t46bjtrn foreign key (categoria_id) references categorias

nov 21, 2022 4:42:29 PM org.hibernate.engine.transaction.jta.platform.internal.JtaPlatformInitiator initiateService
INFO: HHH000490: Using JtaPlatform implementation: [org.hibernate.engine.transaction.jta.platform.internal.NoJtaPlatform]
Exception in thread "main" java.lang.IllegalArgumentException: Provided id of the wrong type for class br.com.alura.loja.modelo.Produto. Expected: class java.lang.Long, got class java.lang.Integer
    at org.hibernate.internal.SessionImpl.find(SessionImpl.java:3343)
    at org.hibernate.internal.SessionImpl.find(SessionImpl.java:3284)
    at br.com.alura.loja.testes.CadastroDeProduto.main(CadastroDeProduto.java:20)
Caused by: org.hibernate.TypeMismatchException: Provided id of the wrong type for class br.com.alura.loja.modelo.Produto. Expected: class java.lang.Long, got class java.lang.Integer
    at org.hibernate.event.internal.DefaultLoadEventListener.checkIdClass(DefaultLoadEventListener.java:155)
    at org.hibernate.event.internal.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:71)
    at org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:113)
    at org.hibernate.internal.SessionImpl.fireLoadNoChecks(SessionImpl.java:1186)
    at org.hibernate.internal.SessionImpl.fireLoad(SessionImpl.java:1175)
    at org.hibernate.internal.SessionImpl.access$2100(SessionImpl.java:193)
    at org.hibernate.internal.SessionImpl$IdentifierLoadAccessImpl.doLoad(SessionImpl.java:2786)
    at org.hibernate.internal.SessionImpl$IdentifierLoadAccessImpl.lambda$load$1(SessionImpl.java:2767)
    at org.hibernate.internal.SessionImpl$IdentifierLoadAccessImpl.perform(SessionImpl.java:2723)
    at org.hibernate.internal.SessionImpl$IdentifierLoadAccessImpl.load(SessionImpl.java:2767)
    at org.hibernate.internal.SessionImpl.find(SessionImpl.java:3322)
    ... 2 more

Process finished with exit code 1
1 resposta

Oi Decio,

Se o atributo id na classe Produto for do tipo Long, então o código deveria ser assim:

Produto produto = em.find(Produto.class, 1L);

Repare na letra L depois do número 1. Serve para dizer ao Java que o valor passado deve ser considerado como Long e não como Integer(default)