Método do Spring Boot sobrescrevendo registro

num projeto Sprint Boot esse código está sobrescrevendo o registro, por favor existe uma forma de corrigir isso?

@PostMapping("/{codigo}")
public ResponseEntity<GrandeComissao> buscarPeloCodigo(@PathVariable Long codigo) {
    Optional<Membro> membro = this.membroRepository.findById(codigo);
    grandeComissao.setNome(membro.get().getNome());
    grandeComissao.setVoto(1);
    grandeComissaoRepository.save(grandeComissao);
    return ResponseEntity.ok(grandeComissao);
}

Estou aberto a perguntas

Você sempre está alterando o mesmo objeto, neste caso é o grandeComissao.
Acredito que você deveria criar sempre um novo ao invés de atualizar o existente.

Obrigado por tentar me ajudar. O meu objetivo é pegar o registro de uma tabela chamada Membro através do ID e gravar esses registro em outra tabela chamada GrandeComissao.

Essas são minhas entidades

@Entity
@Table(name = "membro")
public class Membro {

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

    @NotNull
    private String nome;

    @NotNull
    private String email;

    private String senha;

e essa outra

@Entity
@Table(name = "grande_comissao")
public class GrandeComissao {

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

    private String nome;

    private Integer voto;

@staroski será que existe uma forma de alterar o código para que ele consiga pegar o registro que está na tabela membro e salvar como se fosse um novo registro na tabela grandeComissao?

Primeiramente o framework se chama Spring e não Sprint.

Você tem que criar um novo objeto do tipo GrandeComissao.
Atualmente você está usando uma variável de instância, por isso está alterando sempre o mesmo objeto, está errado, você tem que criar um novo, usa uma variável local, aí fica mais legível.

@PostMapping("/{codigo}")
public ResponseEntity<GrandeComissao> buscarPeloCodigo(@PathVariable Long codigo) {
    Optional<Membro> membro = this.membroRepository.findById(codigo);
    GrandeComissao grandeComissao = new GrandeComissao(); // criar um novo objeto
    grandeComissao.setNome(membro.get().getNome());
    grandeComissao.setVoto(1);
    grandeComissaoRepository.save(grandeComissao);
    return ResponseEntity.ok(grandeComissao);
}
1 curtida

Eu tinha colocando ela como variável global e ao colocar ele como local funcionou perfeitamente. Sou muito grato, muito obrigado. É muito estranho só pelo simples fato de colocar ela como local ela funcionar.

Evite ao máximo usar variáveis de forma global (escopo de classe). Isso só dificulta as implementações e pode trazer efeitos colaterais em sistemas web onde há vários usuários usando o sistema.

1 curtida

Java não tem o conceito de variável global, o mais próximo de uma variável global seria uma variável de classe (estática).
Imagino que você tinha uma variável de instância (não estática).

Não tem nada de estranho, dessa forma você está criando um NOVO objeto.
Se você chama o save do seu repository passando um novo objeto, ele fará um INSERT no banco, se passar um objeto já existente, ele fará o UPDATE no banco.

1 curtida