Adicionar uma chave estrangeira

28 respostas
bootstrapjavaspring-boot
J

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;
    }
}

28 Respostas

T

Mostra o teu modelo amigo

T

Seu problema está no relacionamento feito no seu modelo.

J

Entidade cliente:

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

@Column
private String dataCadastro;

@Column
private Status status;



@OneToOne
@JoinColumn
private Pessoa pessoa;

}

T

mostra o outro modelo, o pessoa.

J

@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;

}

T

acrescenta isso
apaga seu banco e executa de novo.

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

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

image

T

pessoa_codigo é a chave estrangeira amigo ‘-’

J

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.

T

vc ta fazendo o front em que ? thymeleaf ?

J

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

T

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

J

Poderia me orientar como fazer isso?

T

basta tirar o cliente cliente

T

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

pois em cliente vc tem a PK de pessoa

T

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

J

**

**

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

T

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 ?

T

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

T

encurtador.com.br/bGLVW ebook
https://bityli.com/HvjVWJ curso top

vc ta perdido em thymeleaf, recomendo eles.

J

Olha aí. Quando copiei e colei o codigo não estava aparecendo. Printei os dois trexos que chama o spring.

T

tira esse th:objecth=“cliente” vc bota ele lá no form

T

agora me perdi, tu quer cadastrar pessoa e cliente ?

T

vc fez algum uml dessa sua aplicação ? pq já me perdi todo

J

Esta é a modelagem do Sistema:
Recentemente modifiquei algumas coisas.
Mas a relação de chave estrangeira é a mesma.

J

Cliente tem uma relação de composição da entidade Pessoa.

T

agora sim faz sentido, cara, vc tem discord ?

J

Sim, te mandei uma mensagem

Criado 27 de outubro de 2021
Ultima resposta 27 de out. de 2021
Respostas 28
Participantes 2