Adicionar uma chave estrangeira

Olá, estou tendo problemas ao salvar dados de um formulário. O problema é que ao salvar os dados no front-end os dados vão para suas respectivas tabelas. No caso, são duas. Uma tem que ter a chave primaria de uma outra. Mas ao salvar não é possivel adicionar a chave estrangeira de uma forma automatica. Creio que é na minha implementação do controller. Peço a ajuda de quem souber fazer isso.

Obs: Sou novo em frontend.

abaixo vai um trexo meu código do Controller

@Controller
public class ClienteController {
  
  @Autowired
  private ClienteRepository clienteRepository;
  
  @SuppressWarnings("unused")
  @Autowired
  private PessoaRepository pessoaRepository;
  
  @GetMapping("/formCliente")	
  public ModelAndView cadastrarClientes(Pessoa pessoa, Cliente cliente) {
    ModelAndView mv = new ModelAndView();
    mv.setViewName("Cliente/formCliente");	
    mv.addObject("cliente",new Cliente());
    mv.addObject("pessoa",new Pessoa());

    return mv;
  }
  
  @RequestMapping("/salvarClientes")
  public ModelAndView salvarCliente(
    @Valid Cliente cliente, 
    Pessoa pessoa,
    Short codigo, 
    BindingResult br
  ) throws Exception {

    ModelAndView mv = new ModelAndView();

    if (br.hasErrors()) {
      mv.setViewName("Cliente/formCliente");
      mv.addObject("cliente");
      mv.addObject("pessoa");
    } else {
      mv.setViewName("redirect:/clientes-adicionados");
      pessoaRepository.save(pessoa);
      clienteRepository.save(cliente);
    }

    return mv;
    }
}

Mostra o teu modelo amigo

Seu problema está no relacionamento feito no seu modelo.

Entidade cliente:

@Data
@AllArgsConstructor
@NoArgsConstructor
@Entity
public class Cliente extends GenericDomain {

@Column
private String dataCadastro;

@Column
private Status status;



@OneToOne
@JoinColumn
private Pessoa pessoa;

}

mostra o outro modelo, o pessoa.

@Data
@AllArgsConstructor
@NoArgsConstructor
@Entity

public class Pessoa extends GenericDomain{

@Column(name = "nome")
@Size(min = 5, max = 35,message = "O nome deve conter no minimo 5 caracteres")
@NotNull(message = "o campo nome não pode ser nulo")
private String nome;




@Column(name = "cpf")
@Size(max = 14)
@NotBlank(message ="O cpf não pode ser vazio")
@NotNull(message = "o campo cpf não pode ser nulo")
private String cpf;



@Column(name = "rg")
@Size(max = 12)
@NotBlank(message ="O rg não pode ser vazio")
@NotNull(message = "o campo rg não pode ser nulo")
private String rg;








@Column(name = "rua")
@Size(max = 10)
@NotBlank(message ="O rua não pode ser vazio")
@NotNull(message = "o campo rua não pode ser nulo")
private String rua;


@Column(name = "numero")
@NotNull(message = "o campo numero não pode ser nulo")
private Short numero;


@Column(name = "bairro")
@Size(max = 30)
@NotBlank(message ="O bairro não pode ser vazio")
@NotNull(message = "o campo bairro não pode ser nulo")
private String bairro;


@Column(name = "cep")
@Size(max = 10)
@NotBlank(message ="O cep não pode ser vazio")
@NotNull(message = "o campo cep não pode ser nulo")
private String cep;

@Column(name = "complemento")
@Size(max = 10)
@NotBlank(message ="O complemento não pode ser vazio")
@NotNull(message = "o campo complemento não pode ser nulo")
private String complemento;


@Column(name = "telefone")
@Size(max = 13)
@NotBlank(message ="O telefone não pode ser vazio")
@NotNull(message = "o campo telefone não pode ser nulo")
private String telefone;

@Column(name = "celular")
@Size(max = 14)
@NotBlank(message ="O celular não pode ser vazio")
@NotNull(message = "o campo celular não pode ser nulo")
private String celular;

@Column(name = "email")
@Size(max = 100)
@NotBlank(message ="O email não pode ser vazio")
@NotNull(message = "o campo email não pode ser nulo")
private String email;


// inserir chave estrangeira

}

E aonde esta a chave primaria:

@Data
@MappedSuperclass
public class GenericDomain {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Short codigo;

}

acrescenta isso
apaga seu banco e executa de novo.

  @OneToOne(cascade = CascadeType.ALL)
  @JoinColumn(name = "pessoa_id")

Continua não adicionando a chave primaria da tabela pessoa. Ou seja, não tornando ela como estrangeira.

image

pessoa_codigo é a chave estrangeira amigo ‘-’

sim, mas para ser chave estrageira na tabela cliente ele tem que pegar a chave primaria da tabela pessoa. Foi isso que eu quiz dizer. Pois para ser chave estrangeira a mesma chave tem que esta em uma outra tabela sendo ela uma chave primaria.

vc ta fazendo o front em que ? thymeleaf ?

sim, front-and em com o thymeleaf, bootstrap html e CSS.

entendi agora, é o seguinte, vc ta passando duas classe no como paramento, só precisa de apenas uma que é onde está a chave estrangeira, o spring ele já consegue mapear automaticamente, basta passar o objeto correto na sua view

Poderia me orientar como fazer isso?

basta tirar o cliente cliente

na verdade, tu quer salvar um cliente, então tira o Pessoa pessoa

pois em cliente vc tem a PK de pessoa

ai lá no teu form tu bota th:object="${cliente}"

e depois tu passa os inputs com th:field=“com os objetos da classe modelo”

th:field="*{dataCadastro}"

no outro input bota os status th:field="*{status}"

no outro tu bota pessoa th:field="*{pessoa}" e etc

**

**

Eu fiz os campos mas não estava aparecendo: Foi assim que eu chamei.

seu front ta organizado, mas não tem nada para o spring capturar ai, cade os th:fields ? th: values ?

cara, se vc quiser um curso bom de java para web, te recomento o softblue ou javadevAvançado.

eles vão te ensinar tudo bonitinho, vc ta fazendo esse sistema atráves de algum curso ?

faz o seguinte, baixa o ebook do javadevavançado que te dar um macete de formularios com thymeleaf