java - 将 Vaadin CheckBox 保存到 JPA 的正确方法是什么?

标签 java hibernate vaadin vaadin-grid vaadin-flow

我正在寻找 Vaadin 示例,但我根本没有发现 Checkbox 在 JPA 中的任何使用。

我尝试了这个,但只有在复选框上单击一次才有效,如果再次单击同一个框就会中断

private Grid createGrid() {
    grid = new Grid<>();
    ListDataProvider<User> dataProvider = DataProvider.ofCollection(userRepository.findAll());
    grid.setDataProvider(dataProvider);
    grid.setHeight("100%");
    grid.setMaxWidth("840px");

    grid.addColumn(new ComponentRenderer<>(this::createUserInfo)).setWidth(UIUtils.COLUMN_WIDTH_XL);
    grid.addComponentColumn(u -> {
        Checkbox c = new Checkbox();
        c.getStyle().set("font-size", "24px");
        c.setValue(u.isAnwesend());
        c.addValueChangeListener(click -> {
            changeIsAnwesend(u);
        });

        return c;
    })
            .setFlexGrow(0)
            .setWidth(UIUtils.COLUMN_WIDTH_XS);

    grid.addThemeVariants(GridVariant.LUMO_NO_ROW_BORDERS);

    return grid;
}

private void changeIsAnwesend(User user) {
    user.setAnwesend(!user.isAnwesend());
    userRepository.save(user);
}

这是错误:

org.springframework.orm.ObjectOptimisticLockingFailureException: Object of class [com.softwareaustria.backend.data.entity.User] with identifier [21]: optimistic locking failed; nested exception is org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect) : [com.softwareaustria.backend.data.entity.User#21]

Caused by: org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect) : [com.softwareaustria.backend.data.entity.User#21] *

在开始研究 Hibernate 之前,我会问在 Vaadin 中将 Checkbox 保存到 JPA 的正确且常用的方法是什么。

非常感谢!

已解决:

感谢@Kaspar Scherrer 和@Simon Martinelli 的建议

我将方法参数更改为(用户用户,网格网格) 并在 userRepository.save(user);

之后添加
  grid.setItems(userRepository.findAll());

终于工作了!

这是工作代码:

private Grid createGrid() {
        grid = new Grid<>();
        ListDataProvider<User> dataProvider = DataProvider.ofCollection(userRepository.findAll());
        grid.setDataProvider(dataProvider);
        grid.setHeight("100%");
        grid.setMaxWidth("840px");

        grid.addColumn(new ComponentRenderer<>(this::createUserInfo)).setWidth(UIUtils.COLUMN_WIDTH_XL);
        grid.addComponentColumn(u -> {
            Checkbox checkbox = new Checkbox();
            checkbox.getStyle().set("font-size", "24px");
            checkbox.setValue(u.isAnwesend());
            checkbox.addValueChangeListener(click -> {
                changeIsAnwesend(u, grid);
            });

            return checkbox;
        })
                .setFlexGrow(0)
                .setWidth(UIUtils.COLUMN_WIDTH_XS);

        grid.addThemeVariants(GridVariant.LUMO_NO_ROW_BORDERS);

        return grid;
    }

       private void changeIsAnwesend(User user, Grid grid) {
    user.setAnwesend(!user.isAnwesend());
    userRepository.save(user);
    refresh();
}

private void refresh() {
    grid.setItems(userRepository.findAll());
}

最佳答案

我同意西蒙·马丁内利的回答。您的数据“过时”(不是最新的),需要重新加载。
以下是您可以如何做到这一点。

checkbox.addValueChangeListener(click -> {
    changeIsAnwesend(u, grid);
});

....

private void changeIsAnwesend(User user, Grid grid) {
    user.setAnwesend(!user.isAnwesend());
    //grid.setSelectionMode(Grid.SelectionMode.SINGLE).select(user);
    userRepository.save(user);

    // reload data from DB
    ListDataProvider<User> dataProvider = DataProvider.ofCollection(userRepository.findAll());
    grid.setDataProvider(dataProvider);

    // or in short form (it will do the same):
    // grid.setItems(userRepository.findAll());
}

关于java - 将 Vaadin CheckBox 保存到 JPA 的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56738990/

相关文章:

java - 如何通过Hibernate插入多个表

java - 如何在 vaadin 表上设置自定义排序器?

java - 用不同的Spring Boot插件Gradle多个子项目

java - 找不到类型 : java. lang.Short 的 validator

java - 装饰者模式的困惑

java - JPA 实体 (Hibernate) 中的 ENUM 序号

vaadin - 如何阻止文本字段中的复制粘贴?

vaadin - 将 Vaadin 组件与积雪结合使用

java - 我无法使用 Eclipse 安装适用于 Android 的 Crashlytics

java - JPA 2.0 在刷新操作时从映射父类(super class)继承空字段