Estou refazendo um projeto que tinha feito com java e JPA, agora com Spring. Só que estou sem saber o que está acontecendo, salvo os dados do endereço na tabela de endereco, quando vou salvar os dados do membro e passar o endereço para o membro da um erro que diz que está em estado detched e não permite que seja salvo, se alguém puder me ajudar, vou deixar o codigo a baixo:
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;
}
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;
}
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);
}
}
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);
}
}