1
resposta

DURANTE POST, RETORNA MENSAGEM DE "IDENTIFICADOR NULO"

Boa noite!

Criei uma tabela, estou utilizando o sql server, ao tentar fazer post, retorna (isonnomia):

{
  "timestamp": "2023-11-23T00:34:31.345+00:00",
  "status": 500,
  "error": "Internal Server Error",
  "trace": "org.hibernate.AssertionFailure: null identifier (com.somonitores.sistemaOs.clientes.ClientesEntidade)\r\n\tat org.hibernate.engine.spi.EntityKey.<init>(EntityKey.java:50)\r\n\tat org.hibernate.internal.AbstractSharedSessionContract.generateEntityKey(AbstractSharedSessionContract.java:618)\r\n\tat 

segue o arquivo db.migrition sql:

create table clientes2 (

id bigint not null auto_increment,
nomefantasia varchar(100) not null,
razaosocial varchar(100) not null,
tipo varchar(100) not null,
cpfcnpj varchar(100) not null,
contato varchar(100) not null,
ruanum varchar(100) not null,
num varchar(100) not null,
bairro varchar(100) not null,
cidade varchar(100) not null,
cep varchar(100) not null,
fonefixo varchar(100) not null,
fone varchar(100) not null,
celular2 varchar(100) not null,
email varchar(100) not null,
segmento varchar(100) not null,
inscestadual varchar(100) not null,
primary key(id)

);

classe controller:

// =========================cabeçalho========================
@RestController
@RequestMapping("/clientes")

public class ClientesController {

    // declara como atributo da classe controller
    @Autowired  // injeção de dependencia
    private ClientesRepository repository;  // é por aqui que chegara o retorno do BD

    //===========================METODO POST==============================
    @PostMapping  // insere dados no banco de dados
    @Transactional  // toda vez que modificar o banco de dados precisa usar
    // o @RequestBody é para pegar os dados do corpo da requisição
    // o @Valid é para validar os dados do cadastro
    public ResponseEntity cadastrar (@RequestBody @Valid ClientesDados dados, UriComponentsBuilder uriBuilder){
       

       
        var clientesUri = new ClientesEntidade(dados);

       
        repository.save(clientesUri);

       
        var uri = uriBuilder.path( "/clientes/{id}").buildAndExpand( clientesUri.getId()).toUri();

        
        return ResponseEntity.created(uri).body(dados);
        

    }

classe entidade:

@Table(name = "clientes6")
@Entity(name = "ClientesEntidade")
@Getter //gera os médotos getters
@NoArgsConstructor // gerar os contrutores sen arguementos
@AllArgsConstructor //para ter um construtor que recebe todos os campos
@EqualsAndHashCode(of = "id") // gera os equals e os hadcods

public class ClientesEntidade {

    // colunas da tabela
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)

    //@GeneratedValue(strategy = GenerationType.IDENTITY)
    //@Column(columnDefinition = "BIGINT DEFAULT 8912", nullable = false, insertable = false, updatable = false)

    private Long id;
    private String nomefantasia;
    private String razaosocial;
    private String tipo;
    private String cpfcnpj;
    private String contato;
    private String ruanum;
    private String num;
    private String bairro;
    private String cidade;
    private String cep;
    private String fonefixo;
    private String fone;
    private String celular2;
    private String email;
    private String segmento;
    private String inscestadual;

    // construtor
    public ClientesEntidade(ClientesDados dados) {
        this.nomefantasia = dados.nomefantasia();
        this.razaosocial = dados.razaosocial();
        this.tipo = dados.tipo();
        this.cpfcnpj = dados.cpfcnpj();
        this.contato = dados.contato();
        this.ruanum = dados.ruanum();
        this.num = dados.num();
        this.bairro = dados.bairro();
        this.cidade = dados.cidade();
        this.cep = dados.cep();
        this.fonefixo = dados.fonefixo();
        this.fone = dados.fone();
        this.celular2 = dados.celular2();
        this.email = dados.email();
        this.segmento = dados.segmento();
        this.inscestadual = dados.inscestadual();
    }

Dados do post:

{

"nomefantasia": "ANGELICA APARECIDA RIBEIRO SOUZA", "razaosocial": "SUPER ABC", "tipo": "J", "cpfcnpj": "03439028690", "contato": "BIRA", "ruanum": "RUA ITAPECERICA", "num": "400", "bairro": "CENTRO", "cidade": "ABAETE", "cep": "35500-520", "fonefixo": "37-3212-6708", "fone": "37-9-9999-8888", "celular2": "37-9-7777-6666", "email": "eu@uol.com.br", "segmento": "alimentos", "inscestadual": "99996666555544433322" }

    
1 resposta

Oi!

O SQL Server é diferente do MySQL. Nele não tem o conceito de auto_increment, sendo que você precisa definir sequences para a geração dos ids nas tabelas e fazer o mapeamento das sequence na entidade JPA do projeto.

Algo como:

@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sq_clientes_generator")
@SequenceGenerator(name = "sq_clientes_generator", sequenceName = "sequence_clientes")
private Long id;
CREATE TABLE clientes (
    id BIGINT NOT NULL PRIMARY KEY,
    outras colunas...
);

CREATE SEQUENCE sequence_clientes AS BIGINT START WITH 1 INCREMENT BY 1;