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

[Dúvida] Estou com uma duvida na hora de salvar os dados no banco

Olá, estou criando um projetinho pessoal que tinha feito com JPA agora fazendo ele com Spring. Minha duvida é na hora de salvar no banco o objeto Membro, o membro tem um relacionamento com endereço, ai estou salvando o endereço primeiro, depois busco o endereço e utilizo o metódo set para colocar ele no membro, só que está dando alguns problemas. O principal é um erro de compilação poque estou utilizando o Optional, ai na hora de setar o endereço no membro não está compilando.

Vou deixar o código abaixo:

Classe Membro:

@Entity
@Table(name = "tb_membros")
@Getter
@Setter
@NoArgsConstructor
public class Membro {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id", nullable = false)
    private Long id;
    @CPF
    @Column(name = "cpf", unique = true, nullable = false, length = 14)
    private String cpf;
    private String nome;
    private Integer idade;
    private LocalDate dataDeNascimento;
    private Genero sexo;
    private String email;
    private Integer senha;
    private Boolean ativo;
    @OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    private Endereco endereco;
    @OneToOne(fetch = FetchType.LAZY,mappedBy = "membro")
    private ContaMembro contaMembro;


    public Membro(String nome, String cpf, LocalDate dataDeNascimento, Genero sexo, Integer senha, String email) {
        this.nome = nome;
        this.cpf = cpf;
        this.dataDeNascimento = dataDeNascimento;
        this.sexo = sexo;
        this.senha = senha;
        this.email = email;
        this.ativo = true;
    }

Classe Endereco:

@Entity
@Table(name = "tb_enderecos")
@Getter
@Setter
@NoArgsConstructor
public class Endereco {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String rua;
    private Integer numero;
    private String bairro;
    private String cidade;
    private Estado estado;

    public Endereco(String rua, Integer numero, String bairro, String cidade, Estado estado) {
        this.rua = rua;
        this.numero = numero;
        this.bairro = bairro;
        this.cidade = cidade;
        this.estado = estado;
    }

Classe EnderecoService:

@Service
public class EnderecoService {

    @Autowired
    private EnderecoRepository repository;

    @Transactional
    public void salvarEndereco(Endereco endereco) {
        repository.save(endereco);
    }

    public Optional<Endereco> listarEnderecoPorID(Long id) {
        return repository.findById(id);
    }
}

Classe MembroService:

@Service
public class MembroService {
    @Autowired
    private MembroRepository repository;
    @Autowired
    private List<IValidar<Membro>> validador;

    @Transactional
    public void salvarMembro(Membro membro) {
        calcularIdade(membro);
        validador.forEach(v -> v.validar(membro));
        repository.save(membro);
    }

    private void calcularIdade(Membro membro) {
        LocalDate dataDeNasc = membro.getDataDeNascimento();
        LocalDate dataAtual = LocalDate.now();
        Integer idade = (int) ChronoUnit.YEARS.between(dataDeNasc, dataAtual);
        membro.setIdade(idade);
    }
}
3 respostas

Classe Main:

@SpringBootApplication
public class DizimoApplication implements CommandLineRunner {

    private static Scanner scanner = new Scanner(System.in);
    @Autowired
    private EnderecoService enderecoService;
    @Autowired
    private MembroService membroService;

    public static void main(String[] args) {
        SpringApplication.run(DizimoApplication.class, args);
    }

    @Override
    public void run(String... args) throws Exception {
        System.out.println("Digite o nome da rua: ");
        String rua = scanner.nextLine();

        System.out.println("Digite o numero da sua residencia: ");
        Integer numero = scanner.nextInt();

        System.out.println("Digite o nome do seu bairro: ");
        String bairro = scanner.nextLine();
        bairro = scanner.nextLine();

        System.out.println("Digite o nome da sua cidade: ");
        String cidade = scanner.nextLine();

        System.out.println("Digite a sigla do seu estado (ex: SP): ");
        String estado = scanner.nextLine();
        Estado estado1 = Estado.acronym(estado);

        Endereco endereco = new Endereco(rua, numero, bairro, cidade, estado1);

        enderecoService.salvarEndereco(endereco);

        System.out.println("Digite seu nome completo: ");
        String nome = scanner.nextLine();

        System.out.println("Digite seu CPF: ");
        String cpf = scanner.nextLine();

        System.out.print("Digite a data de nascimento (no formato YYYY-MM-DD): ");
        String dataNascimentoStr = scanner.nextLine();
        LocalDate dataNascimento = LocalDate.parse(dataNascimentoStr);

        System.out.print("Digite o sexo (M/F): ");
        char sexoChar = scanner.nextLine().charAt(0);
        Genero sexo = Genero.fromChar(sexoChar);

        System.out.print("Digite o email do membro: ");
        String email = scanner.nextLine();

        System.out.print("Digite a senha do membro: ");
        Integer senha = scanner.nextInt();

        Optional<Endereco> enderecoEncontrado = enderecoService.listarEnderecoPorID(endereco.getId());

        if (enderecoEncontrado.isPresent()) {
            Membro membro = new Membro(nome,cpf,dataNascimento,sexo,senha,email);
            membro.setEndereco(enderecoEncontrado);
            membroService.salvarMembro(membro);
        } else {
            throw new Exception("Não foi possivel cadastrar o membro");
        }


    }
}

O erro de compilação está no metodo " membro.setEndereco(enderecoEncontrado); ", se alguém souber oq está acontecendo, me falem aqui.

solução!

Olá, Bruno! Entendo que você está tendo problemas com o uso do Optional ao tentar salvar um objeto Membro que possui um relacionamento com Endereço.

O Optional é um container que pode ou não conter um valor não-nulo. Ele oferece uma maneira melhor de lidar com valores que podem ser nulos, evitando NullPointerException. No entanto, quando você tenta acessar o valor dentro do Optional, você precisa usar o método get() ou orElse(), que retornará o valor se ele estiver presente ou retornará o valor padrão que você passar para orElse().

No seu caso, na classe EnderecoService, o método listarEnderecoPorID(Long id) retorna um Optional. Então, ao chamar esse método, você precisa lidar com o Optional.

Por exemplo, se você está tentando definir o endereço de um membro, você pode fazer algo assim:

Optional<Endereco> enderecoOptional = enderecoService.listarEnderecoPorID(id);
if (enderecoOptional.isPresent()) {
    membro.setEndereco(enderecoOptional.get());
} else {
    // Tratar caso o endereço não esteja presente
}

Ou, se você quiser lançar uma exceção quando o endereço não estiver presente, você pode usar o método orElseThrow():

Endereco endereco = enderecoService.listarEnderecoPorID(id).orElseThrow(() -> new RuntimeException("Endereço não encontrado"));
membro.setEndereco(endereco);

Espero ter ajudado e bons estudos!

Obrigado pela ajuda consegui resolver esse problema. Só que agora surgiu outro, está dando esse erro:

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

Pelo o que entendi está dizendo que o endereço está em estado de Detechd, só não sei como fazer pra resolver isso.