2
respostas

[Dúvida] Spring Data JPA não está gerando o id automaticamente!

Boa tarde!

Quando fui usar o método "save( )" para inserir um registro no banco de dados (mysql), houve uma exception, que dizia que o meu id estava null, e isso eu consegui resolver simplesmente setando o id antes de salvá-lo:

@SpringBootApplication
public class SpringDataApplication implements CommandLineRunner {

    private final CargoRepository repository;

    public SpringDataApplication (CargoRepository repository) {
        this.repository = repository;
    }

    public static void main(String[] args) {
        SpringApplication.run(SpringDataApplication.class, args);
    }

    @Override
    public void run(String... args) throws Exception {
        Cargo cargo = new Cargo();
        cargo.setDescricao("desenvolvedor de software");
        cargo.setId(1);
        repository.save(cargo);
    }

Mas isso não tá correto, visto que eu mandei o jpa gerar o id automaticamente nessa classe (cargo):

@Entity
@Table(name = "cargos")
public class Cargo {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id; 
    private String descricao;

Como resolver isso? Já dei um "describe" lá no mysql e a tabela realmente está como "auto_increment"!

Erro:

Caused by: java.lang.reflect.InvocationTargetException: null
    at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:116) ~[na:na]
    at java.base/java.lang.reflect.Method.invoke(Method.java:577) ~[na:na]
    at org.springframework.beans.BeanWrapperImpl$BeanPropertyHandler.getValue(BeanWrapperImpl.java:308) ~[spring-beans-5.3.25.jar:5.3.25]
    at org.springframework.beans.AbstractNestablePropertyAccessor.getPropertyValue(AbstractNestablePropertyAccessor.java:630) ~[spring-beans-5.3.25.jar:5.3.25]
    ... 37 common frames omitted
Caused by: java.lang.NullPointerException: Cannot invoke "java.lang.Integer.intValue()" because "this.id" is null
    at br.com.alura.spring.data.model.Cargo.getId(Cargo.java:23) ~[classes/:na]
    at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104) ~[na:na]
    ... 40 common frames omitted
2 respostas

Pelo seu código você postou, creio que não tenha erros realmente, pelo menos achei tudo correto. Você poderia postar o código da qual monta o model Cargo no seu código fonte da qual faz a chamada real do seu repository sem passar o Id?

Você também já checkou se a anotação que você importou @Id seja realmente do package javax.persistence ou jakarta.persistence?

Chequei sim! A importação está correta. Vou mandar o código da classe Cargo e o seu repository. Cargo:

package br.com.alura.spring.data.model;

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

@Entity
@Table(name = "cargos")
public class Cargo {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id; 
    private String descricao;

    public Cargo() {

    }

    public long getId() {
        return id;
    }
    public String getDescricao() {
        return descricao;
    }
    public void setDescricao(String descricao) {
        this.descricao = descricao;
    }

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


}

CargoRepository:

package br.com.alura.spring.data.repository;

import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;

import br.com.alura.spring.data.model.Cargo;

@Repository
public interface CargoRepository extends CrudRepository<Cargo, Integer>{

}