Solucionado (ver solução)
Solucionado
(ver solução)
26
respostas

[Projeto] A notação

@Table(name = "checkListAdicional")
@Entity(name = "CheckListAdicional")
@Getter
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(of = "id")
public class CheckListAdicional {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @OneToMany(fetch = FetchType.LAZY)
    @JoinColumn(name = "check_id") //erro
    private Check check;

    private boolean ativo;

    public CheckListAdicional(DadosCadastroChelistAdicional dados){
        this.ativo = true;
        this.check = dados.check();
    }

    public void atualizacaoInfomacaoChekListAdicional(DadosAtualizacaoChelistAdicional dados){
        this.check = dados.check();
    }
    
    public void excluir(Long id) {
        this.ativo = false;
    }

    public void ativar(Long id) {
        this.ativo = true;
    }
}

Está dando erro na linha @JoinColumn(name = "check_id") //erro, e no projeto abaixo está igual, não sei o que está acontecendo isso. https://cursos.alura.com.br/course/spring-boot-3-documente-teste-prepare-api-deploy/task/122044

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Entity 'br.com.api.checkListlab.domain.checkListAdicional.CheckListAdicional' has no identifier (every '@Entity' class must declare or inherit at least one '@Id' or '@EmbeddedId' property)

26 respostas

Oi!

Verifica os imports da classe, pois é provável que você importou a anotação @Id do Spring, ao invés do pacote da JPA (jakarta.persistence)

mas ele está como jakarta.pasistence.

package br.com.api.checkListlab.domain.check;

import jakarta.persistence.*;
import lombok.*;

@Table(name = "chek")
@Entity(name = "Chek")
@Getter
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(of = "id")
public class Check {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String chek;
    private boolean ativo;

    public Check(DadosAtualizacaoCadastroCheck dados) {
        this.ativo = true;
        this.chek = dados.chek();
    }

    public void atualizacaoInfomacaoCheck(DadosAtualizacaoCadastroCheck dados) {
        this.chek = dados.chek();
    }

    public void excluir(Long id){
        this.ativo = false;
    }
    
    public void ativar(Long id){
        this.ativo = true;
    }
}
package br.com.api.checkListlab.domain.check;

import jakarta.persistence.*;
import lombok.*;

@Table(name = "chek")
@Entity(name = "Chek")
@Getter
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(of = "id")
public class Check {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String chek;
    private boolean ativo;

    public Check(DadosAtualizacaoCadastroCheck dados) {
        this.ativo = true;
        this.chek = dados.chek();
    }

    public void atualizacaoInfomacaoCheck(DadosAtualizacaoCadastroCheck dados) {
        this.chek = dados.chek();
    }

    public void excluir(Long id){
        this.ativo = false;
    }
    
    public void ativar(Long id){
        this.ativo = true;
    }
}

O erro aconteceu na entidade CheckListAdicional

Foi mal coloque 2 códigos duplicados.

package br.com.api.checkListlab.domain.checkListAdicional;

import br.com.api.checkListlab.domain.check.Check;
import jakarta.persistence.*;
import lombok.*;

@Table(name = "checkListAdicional")
@Entity(name = "CheckListAdicional")
@Getter
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(of = "id")
public class CheckListAdicional {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @OneToMany(fetch = FetchType.LAZY)
    @JoinColumn(name = "check_id")
    private Check check;

    private boolean ativo;

    public CheckListAdicional(DadosCadastroChelistAdicional dados){
        this.ativo = true;
        this.check = dados.check();
    }

    public void atualizacaoInfomacaoChekListAdicional(DadosAtualizacaoChelistAdicional dados){
        this.check = dados.check();
    }
    
    public void excluir(Long id) {
        this.ativo = false;
    }

    public void ativar(Long id) {
        this.ativo = true;
    }
}

Está certo mesmo. Mas acho que nessa entidade esse relacionamento aqui deveria ser ManyToOne e não OneToMany, pois não é uma lista:

@OneToMany(fetch = FetchType.LAZY)
@JoinColumn(name = "check_id")
private Check check;

Mas o que eu quero fazer é colocar vários checks em um único check adicional. Fiz como o com professor falou e mesmo assim não foi. git projeto. https://github.com/brunoffraga/apiRepository/blob/master/api/src/main/java/br/com/api/checkListlab/domain/checkListAdicional/CheckListAdicional.java

Então o mapeamento deve ficar assim:

@Table(name = "checkListAdicional")
@Entity(name = "CheckListAdicional")
@Getter
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(of = "id")
public class CheckListAdicional {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "checkListAdicional")
    private List<Check> check;

    private boolean ativo;

    public CheckListAdicional(DadosCadastroChelistAdicional dados){
        this.ativo = true;
        this.check = dados.check();
    }

    public void atualizacaoInfomacaoChekListAdicional(DadosAtualizacaoChelistAdicional dados){
        this.check = dados.check();
    }
    
    public void excluir(Long id) {
        this.ativo = false;
    }

    public void ativar(Long id) {
        this.ativo = true;
    }
}
@Table(name = "chek")
@Entity(name = "Chek")
@Getter
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(of = "id")
public class Check {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String chek;
    private boolean ativo;
    
    @ManyToOne
    private CheckListAdicional checkListAdicional;

    public Check(DadosAtualizacaoCadastroCheck dados) {
        this.ativo = true;
        this.chek = dados.chek();
    }

    public void atualizacaoInfomacaoCheck(DadosAtualizacaoCadastroCheck dados) {
        this.chek = dados.chek();
    }

    public void excluir(Long id){
        this.ativo = false;
    }
    
    public void ativar(Long id){
        this.ativo = true;
    }
}

Se ainda der erro, manda aqui o log de erro completo, pois pode ser outro problema que está ocorrendo.

Deu certo, obrigado.

Estava qui tentando atribuir para o banco de dados, mas estou tendo dificuldades. não seria melhor colocar um id para lincar os 2?

As tabelas devem ficar assim:

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

E como fazer para colocar na migrativo.

create table check(

    id bigint not null auto_increment,
    check varchar(255) not null,
    //aqui eu não sei colocar a ManyToOne
     ativo = 1,

    primary key(id)

);
create table check_list_adicional(

    id bigint not null auto_increment,
    ativo = 1,
    //aqui eu não sei colocar a OneToMay,

    primary key(id)

);

idtotalcontrol bigint not null, seria isso?

solução!

As migrations seriam assim:

create table checkListAdicional(
    id bigint not null auto_increment,
    ativo boolean,
    
    primary key(id)
);
create table chek(
    id bigint not null auto_increment,
    check varchar(255) not null,
    ativo boolean,
    check_list_adicional_id bigint,
    
    primary key(id),
    foreign key check_check_list_adicional_id references checkListAdicional(id)
);

Entendi muito obrigado

não estou conseguindo avançar aqui ate fui procurar no projeto e não achei o que fazer Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Ah sim, check é uma palavra reservada no MySQL e não pode ser utilizada como nome de tabela ou coluna. Mas dá para resolver fazendo o escape delas:

create table `check`(
    id bigint not null auto_increment,
    `check` varchar(255) not null,
    ativo boolean,
    check_list_adicional_id bigint,
    
    primary key(id),
    foreign key check_check_list_adicional_id references checkListAdicional(id)
);

Obs: cuidado com a última linha, que cria a foreign key, pois na parte do references precisa passar o nome da tabela certinho e na sua migration está passando o nome checklistadicional, mas precisa ser checkListAdicional.

Então Tentei de tudo quanto foi jeito, mas não está funcionando, tirei o primeiro check ex:"foreign key check_list_adicional_id" coloque troquei os nomes dos dois locais create "table checkListAdicional();" por "create table check_list_adicional" e aqui também para funcionar, foreign key check_check_list_adicional_id references check_list_adicional(id), tentei outras coisas também e por último foi assim. Insira aqui a descrição dessa imagem para ajudar na acessibilidadeInsira aqui a descrição dessa imagem para ajudar na acessibilidadetentei até como checklistadicional como está qui na foto.

As migrations estão corretas. Apenas na migration V2 que você deve tirar as crases do escape da última linha (linha da foreign key).

Depois de fazer esse ajuste você precisa apagar o banco e criar novamente:

drop database controle-de-laboratiorio;
create database controle-de-laboratiorio;

Feito como o sr falou e não funcionou Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Tentei fazer direto no mysql e não foi. Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Na linha do foreign key você não removeu as crases.

Tinha esquecido de tirar a crases, mas feito isso e não funcionou.

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Boa! Eu que mandei errado agora :D

O certo:

create table `check`(
    id bigint not null auto_increment,
    `check` varchar(255) not null,
    ativo boolean,
    check_list_adicional_id bigint,
    
    primary key(id),
    foreign key (check_list_adicional_id) references checkListAdicional(id)
);

Finalmente deu certo, muito obrigado professor.