Ajuda com Vaadin/MySQL

Bom dia a todos, antes de tudo, quero dizer que sou novo em Vaadin e Mysql, provavelmente meu erro deve ser simples, por pura falta de conhecimento. Vamos ao cenário

Tenho sistema de cadastro de produtos, a tela deste cadastro é composta por 5 informações:

ID, Nome, Marca, Modelo, Valor Unitário

O ID deve ser fornecido pelo Mysql, o restante informado pelo usuário.

Estou usando Vaadin 14 + Spring + Mysql.

“Tudo” está funcionando bem, a tela de cadastro abre, e o usuário passa as informações

Agora começa os erros:

1º O ID não está sendo gerado pelo Mysql
2º Quando o usuário clica em salvar, os dados do produto NÃO SÃO salvos no banco.

Como faço para que o ID seja gerado pelo Mysql, e também como fazer para que os dados sejam salvos no banco?

Segue minhas classes:

package br.com.fjsistemas.repository;

import org.springframework.data.jpa.repository.JpaRepository;

import br.com.fjsistemas.backend.Produto;


public interface ProdutoRepository extends JpaRepository<Produto, Integer> {

	
}



package br.com.fjsistemas.service;

import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import br.com.fjsistemas.backend.Produto;
import br.com.fjsistemas.repository.ProdutoRepository;

@Service
public class ProdutoService {
	
	private static final Logger LOGGER = Logger.getLogger(ProdutoService.class
			.getName());


	@Autowired
	private ProdutoRepository produtoRepository;

	public List<Produto> buscar() {
		List<Produto> produtos = produtoRepository.findAll();
		return produtos;

	}
	
	public void salvar(Produto produto) {
		if (produto == null) {
			LOGGER.log(Level.SEVERE, "O contato é nulo. Tem certeza de que conectou seu formulário"
					+ "para o aplicativo?");
			return;
		}
		produtoRepository.save(produto);
	}
}




package br.com.fjsistemas.view;

import java.util.List;
import java.util.Locale;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import com.vaadin.flow.component.Text;
import com.vaadin.flow.component.button.Button;
import com.vaadin.flow.component.button.ButtonVariant;
import com.vaadin.flow.component.dialog.Dialog;
import com.vaadin.flow.component.grid.Grid;
import com.vaadin.flow.component.grid.GridVariant;
import com.vaadin.flow.component.html.Div;
import com.vaadin.flow.component.icon.Icon;
import com.vaadin.flow.component.icon.VaadinIcon;
import com.vaadin.flow.component.notification.Notification;
import com.vaadin.flow.component.notification.Notification.Position;
import com.vaadin.flow.component.orderedlayout.HorizontalLayout;
import com.vaadin.flow.component.textfield.TextField;
import com.vaadin.flow.data.binder.Binder;
import com.vaadin.flow.data.converter.StringToDoubleConverter;
import com.vaadin.flow.data.renderer.NumberRenderer;
import com.vaadin.flow.router.PageTitle;
import com.vaadin.flow.router.Route;
import com.vaadin.flow.router.RouteAlias;
import com.vaadin.flow.spring.annotation.UIScope;

import br.com.fjsistemas.backend.Produto;
import br.com.fjsistemas.main.MainView;
import br.com.fjsistemas.service.ProdutoService;

@Route(value = "cadastroproduto", layout = MainView.class)
@PageTitle("Cadastro de Produtos")
@RouteAlias(value = "Cadastro Produtos", layout = MainView.class)
@Component
@UIScope
public class CadastroProduto extends Div {

	private static final long serialVersionUID = 1L;

	private List<Produto> lista;
	private Grid<Produto> grid;

	private final Button remover;
	private final Button adicionar;
	private final Button edit;

	private Produto produtoAtual;

	private final Binder<Produto> janelaBinder = new Binder<>(Produto.class);
	private final Binder<Produto> gridBinder = new Binder<>(Produto.class);

	private final TextField gridTxtNome = new TextField();
	private final TextField gridTxtMarca = new TextField();
	private final TextField gridTxtModelo = new TextField();
	private final TextField gridTxtValor = new TextField();

	private ProdutoService produtoService;

	@Autowired
	public CadastroProduto(ProdutoService produtoService) {
		this.produtoService = produtoService;
		addGrid();

		Dialog janela = getEditDialog();

		adicionar = new Button(new Icon(VaadinIcon.PLUS_CIRCLE_O));
		adicionar.addThemeVariants(ButtonVariant.LUMO_PRIMARY);
		adicionar.addClickListener(event -> janela.open());

		remover = new Button(new Icon(VaadinIcon.MINUS_CIRCLE_O));
		remover.addThemeVariants(ButtonVariant.LUMO_PRIMARY);
		remover.addClickListener(event -> {
			if (produtoAtual != null) {
				lista.remove(produtoAtual);
				grid.setItems(lista);
				produtoAtual = null;
				enableEditingButtons(false);
			}
		});

		edit = new Button(new Icon(VaadinIcon.EDIT));
		edit.addThemeVariants(ButtonVariant.LUMO_PRIMARY);
		edit.addClickListener(e -> {
			grid.getEditor().editItem(produtoAtual);
			gridTxtNome.focus();
			gridTxtMarca.focus();
			gridTxtModelo.focus();
			gridTxtValor.focus();

		});

		enableEditingButtons(false);
		HorizontalLayout layoutInterno2 = new HorizontalLayout();
		layoutInterno2.add(adicionar, remover, edit);
		add(layoutInterno2);
	}

	private Dialog getEditDialog() {
		Dialog janela = new Dialog();

		janela.setCloseOnEsc(false);
		janela.setCloseOnOutsideClick(false);
		janela.setWidth("700px");
		janela.setHeight("360px");

		HorizontalLayout layoutJanelaInterno1 = new HorizontalLayout();

		Text titulo = new Text("Novo Produto");

		HorizontalLayout layoutJanelaInterno2 = new HorizontalLayout();

		TextField nome = new TextField("Produto:");
		nome.setMinWidth("50%");

		TextField marca = new TextField("Marca:");
		marca.setMinWidth("50%");

		HorizontalLayout layoutJanelaInterno3 = new HorizontalLayout();

		TextField modelo = new TextField("Modelo:");
		modelo.setWidth("50%");

		TextField valor = new TextField("Valor Unitário:");
		valor.setWidth("50%");

		layoutJanelaInterno1.add(titulo);
		layoutJanelaInterno1.setMargin(isVisible());
		layoutJanelaInterno2.add(nome, marca);
		layoutJanelaInterno2.setMargin(isVisible());
		layoutJanelaInterno3.add(modelo, valor);
		layoutJanelaInterno3.setMargin(isVisible());

		janelaBinder.forField(nome).withConverter(String::toUpperCase, String::valueOf, " ").bind(Produto::getNome,
				Produto::setNome);

		janelaBinder.forField(marca).withConverter(String::toUpperCase, String::valueOf, " ").bind(Produto::getMarca,
				Produto::setMarca);

		janelaBinder.forField(modelo).withConverter(String::toUpperCase, String::valueOf, " ").bind(Produto::getModelo,
				Produto::setModelo);

		janelaBinder.forField(valor).withConverter(new StringToDoubleConverter(0.0, "Valor Inválido"))
				.withNullRepresentation(0.0).bind(Produto::getValor, Produto::setValor);

		HorizontalLayout layoutBotoes = new HorizontalLayout();

		Button salvar = new Button("Salvar");
		salvar.addThemeVariants(ButtonVariant.LUMO_PRIMARY);
		salvar.getStyle().set("margin-top", "25px");
		salvar.addClickListener(event -> {
			Produto produtoNovo = new Produto();
			produtoService.salvar(produtoAtual);
			lista.add(produtoNovo);
			grid.setItems(lista);
			janelaBinder.writeBeanIfValid(produtoNovo);
			janelaBinder.readBean(new Produto(null, " ", " ", " ", null));
			janelaBinder.getFields().forEach(f -> f.clear());

			
		});

		Button fechar = new Button("Fechar");
		fechar.addThemeVariants(ButtonVariant.LUMO_PRIMARY);
		fechar.getStyle().set("margin-top", "25px");
		fechar.addClickListener(event -> {
			janela.close();
		});

		janela.add(layoutJanelaInterno1);
		janela.add(layoutJanelaInterno2);
		janela.add(layoutJanelaInterno3);
		janela.add(layoutBotoes);

		layoutBotoes.add(salvar, fechar);
		return janela;
	}

	private void enableEditingButtons(boolean enable) {
		remover.setEnabled(enable);
		edit.setEnabled(enable);
	}

	private void addGrid() {

		lista = produtoService.buscar();
		
		grid = new Grid<>();

		grid.setItems(lista);
		grid.setHeight("835px");

		grid.addColumn(Produto::getId).setHeader("ID:").setAutoWidth(true);

		grid.addColumn(Produto::getNome).setHeader("Produto:").setAutoWidth(true).setKey("nome");

		grid.addColumn(Produto::getMarca).setHeader("Marca:").setAutoWidth(true).setKey("marca");

		grid.addColumn(Produto::getModelo).setHeader("Modelo:").setAutoWidth(true).setKey("modelo");

		grid.addColumn(new NumberRenderer<>(Produto::getValor, "R$ %(,.2f", Locale.getDefault(), "R$ 0.00"))
				.setHeader("Valor Unitário:").setAutoWidth(true).setKey("valor");

		grid.addThemeVariants(GridVariant.LUMO_COMPACT, GridVariant.LUMO_COLUMN_BORDERS);

		grid.asSingleSelect().addValueChangeListener(e -> {
			produtoAtual = e.getValue();
			enableEditingButtons(e.getValue() != null);
		});

		grid.getEditor().setBinder(gridBinder);

		gridTxtNome.getElement().addEventListener("keydown", event -> grid.getEditor().cancel())
				.setFilter("event.key === 'Enter'");

		gridTxtMarca.getElement().addEventListener("keydown", event -> grid.getEditor().cancel())
				.setFilter("event.key === 'Enter'");

		gridTxtModelo.getElement().addEventListener("keydown", event -> grid.getEditor().cancel())
				.setFilter("event.key === 'Enter'");

		gridTxtValor.getElement().addEventListener("keydown", event -> grid.getEditor().cancel())
				.setFilter("event.key === 'Enter'");

		gridBinder.forField(gridTxtNome).withConverter(String::toUpperCase, String::valueOf, " ").bind("nome");
		grid.getColumnByKey("nome").setEditorComponent(gridTxtNome);

		gridBinder.forField(gridTxtMarca).withConverter(String::toUpperCase, String::valueOf, " ").bind("marca");
		grid.getColumnByKey("marca").setEditorComponent(gridTxtMarca);

		gridBinder.forField(gridTxtModelo).withConverter(String::toUpperCase, String::valueOf, " ").bind("modelo");
		grid.getColumnByKey("modelo").setEditorComponent(gridTxtModelo);

		gridBinder.forField(gridTxtValor).withConverter(new StringToDoubleConverter("Número Inválido")).bind("valor");
		grid.getColumnByKey("valor").setEditorComponent(gridTxtValor);

		grid.getEditor().addCloseListener(event -> {
			if (gridBinder.getBean() != null) {
				Notification.show("Texto Alterado!", 1000, Position.TOP_END);

			}
		});
		add(grid);
	}
}

alguem poderia me ajudar? :frowning:

help