1
resposta

Relacionamento entre entidades

Fala pessoal, beleza? Estou preso tentando fazer um relacionamento entre minhas entidades "Cliente" e "ContaBancaria". Alguém poderia me dar uma luz, por favor?

@Entity(name = "Cliente")
@Table(name = "clientes")
@Getter
@Setter
@AllArgsConstructor
@EqualsAndHashCode
public class Cliente {

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

    private String nome;

    private String cpf;

    private String numeroContato;

    @Enumerated(EnumType.STRING)
    private Beneficio beneficio;

    @Embedded
    private Endereco endereco;

    @OneToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "conta_id", referencedColumnName = "id")
    private ContaBancaria contaBancaria;

    private boolean ativo = true;

    public Cliente() {

    }

    public Cliente(DadosCadastraCliente dados) {
        this.nome = dados.nome();
        this.cpf = dados.cpf();
        this.numeroContato = dados.numeroContato();
        this.beneficio = dados.beneficio();
        this.endereco = new Endereco(dados.endereco());
        this.contaBancaria = new ContaBancaria(dados.contaBancaria());
        this.ativo = true;
    }
}
@Entity(name = "Conta")
@Table(name = "contas")
@AllArgsConstructor
@NoArgsConstructor
@Getter
@Setter
public class ContaBancaria {

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

    private String numeroDaConta;

    private TipoDeConta tipoDeConta;

    private BigDecimal saldo;

    public ContaBancaria(DadosDetalhamentoContaBancaria dados) {
        this.numeroDaConta = UUID.randomUUID().toString();
        this.tipoDeConta = dados.tipoDeConta();
        this.saldo = dados.saldo();
    }

    public ContaBancaria(DadosCadastraContaBancaria dadosCadastraContaBancaria) {
        this.numeroDaConta = UUID.randomUUID().toString();
        this.tipoDeConta = dadosCadastraContaBancaria.tipoDeConta();
        this.saldo = dadosCadastraContaBancaria.saldo();
    }
}
@RestController
@RequestMapping("/clientes")
public class ClienteController {

    @Autowired
    private ClienteRepository clienteRepository;

    ContaBancaria contaBancaria = new ContaBancaria();

    @PostMapping(value = "/signup")
    @Transactional
    public ResponseEntity cadastraCliente(
            @RequestBody DadosCadastraCliente dadosCadastraCliente,
            UriComponentsBuilder uriComponentsBuilder) {

        var resultCliente = new Cliente(dadosCadastraCliente);
        clienteRepository.save(resultCliente);

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

        return ResponseEntity.created(uri).body(new DadosDetalhamentoCliente(resultCliente));
    }
}
@RestController
@RequestMapping("/contas")
public class ContaBancariaController {

    @Autowired
    private ContaBancariaRepository contaBancariaRepository;

    @PostMapping(value = "/signup")
    @Transactional
    public ResponseEntity cadastraContaBancaria(@RequestBody DadosCadastraContaBancaria dadosCadastraContaBancaria, UriComponentsBuilder uriComponentsBuilder) {
        var resultContaBancaria = new ContaBancaria(dadosCadastraContaBancaria);
        contaBancariaRepository.save(resultContaBancaria);

        var uri = uriComponentsBuilder.path("/contas/{id}").buildAndExpand(resultContaBancaria.getId()).toUri();

        return ResponseEntity.created(uri).body(new DadosDetalhamentoContaBancaria(resultContaBancaria));
    }
}
1 resposta

Oii, Lucas! Tudo bem?

Parabéns por colocar em prática o que vem aprendendo, continue assim!

Observe que no seu código, é criado uma instância de ContaBancaria no construtor de Cliente e isso pode estar causado problemas no relacionamento. Como sugestão, você pode adicionar a referência da conta bancária já existente no momento da criação do cliente, ou seja, modificar o construtor de Cliente para receber a conta bancário como parâmetro. Depois, no método, cadastraCliente do ClienteController, você pode obter a conta bancária a partir do ContaBancariaRepository e passá-la para o construtor do cliente.

Espero que as sugestões seja um bom ponto de partida. É importante lembrar de adaptá-las conforme a necessidade do seu código e salvar antes de testar.

Continue interagindo no fórum compartilhando suas dúvidas, projetos e sugestões.

Bons estudos, Lucas!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software