将Vaadin复选框保存到JPA的正确方法是什么?



我想找到一个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中的jpa的正确和通常的方法。

非常感谢!

解决:

感谢@Kaspar Scherrer和@simon Martinelli

的Subestion

i将方法参数更改为(用户用户,网格网格(并在 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());
}

我同意西蒙·马丁内利(Simon Martinelli(的答案。您的数据是"陈旧"(不是最新的(,需要重新加载。
这是您可以做的。

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());
}

您的方式接缝可行,但您还有另一个问题。

您获得了一个ObjectOptimisticLockingFailureException,这意味着与您的用户对象在数据库中已更改。

在设置Anwesend标志之前,您必须从数据库中重新加载实体。

相关内容

最新更新