1
resposta

problema com persistencia de atributo lista

Tô tentando salvar no banco um objeto de uma entidade, mas não ta rolando por que ele acusa que um atributo ta indo como nulo. Segue os códigos:

@Entity(name = "alimentos")
@Table(name = "tb_alimentos")
@AllArgsConstructor
@NoArgsConstructor
@Getter
@Setter
public class Alimento {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id_alimento")
    private Long id;
    @Column(name = "data_doacao")
    @CreatedDate
    @Temporal(TemporalType.DATE)
    private LocalDate dataDoacao;
    @ElementCollection
    @CollectionTable(name = "tags_alimento", joinColumns = @JoinColumn(name = "id_alimento"))
    @Column(name = "tag")
    private List<String> tags;
    @ManyToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "restaurante_doador_id", nullable = false)
    private Restaurante restauranteDoador;
    @Column(name = "alimento_ativo", columnDefinition = "BIT(1) DEFAULT 1")
    private Boolean ativo = true;

    public Alimento(AlimentoDTO dadosAlimento) {
        this.tags = dadosAlimento.tags();
        this.restauranteDoador = new Restaurante(dadosAlimento.restauranteDoadorId());
    }

    public void desativarAlimento(){
        this.ativo = false;
    }

    @PrePersist
    protected void prePersist() {
        dataDoacao = LocalDate.now();
    }
}
@Service
public class AlimentoService {

    @Autowired
    AlimentoRepository alimentoRepository;


    public Alimento salvarAlimento(Alimento newAlimento){
            return alimentoRepository.save(newAlimento);
    }
}
import java.util.List;

@RestController
public class AlimentoController {

    @Autowired
    private AlimentoService alimentoService;

    @Autowired
    private RestauranteService restauranteService;

    @PostMapping("/alimentos")
    public ResponseEntity<Alimento> cadastrarAlimento(@RequestBody AlimentoDTO alimentoDTO) {
        Restaurante restauranteDoador = restauranteService.findRestauranteById(alimentoDTO.restauranteDoadorId());
        if (restauranteDoador == null) {
            return ResponseEntity.notFound().build();
        }

        Alimento alimento = new Alimento(alimentoDTO);
        alimento.setRestauranteDoador(restauranteDoador);
        Alimento novoAlimento = alimentoService.salvarAlimento(alimento);

        return ResponseEntity.status(HttpStatus.CREATED).body(novoAlimento);
    }
    public record AlimentoDTO(List<String> tags, Long restauranteDoadorId) {
}

O repositório com o código completo é esse: https://github.com/trcosta97/GS-DBE

1 resposta

Olá Thiago!

Ao analisar o código fornecido, percebi que o atributo que pode estar causando o problema é a lista de tags. Como essa lista é uma coleção de elementos, é necessário utilizar a anotação @ElementCollection na declaração do atributo na classe Alimento.

Além disso, é preciso garantir que a lista de tags não esteja nula antes de salvar o objeto no banco de dados. Uma forma de fazer isso é inicializar a lista na declaração do atributo ou no construtor da classe Alimento.

Tente fazer essas alterações e veja se o problema é resolvido. Bons estudos!