Vaadin + Checkbox + Table + JPAContainer =问题

时间:2014-07-15 02:25:54

标签: java jpa checkbox vaadin

我正在尝试在Vaadin 7中创建一个使用JPAContainer作为数据源的表。在此表的其中一列中,我有一个生成列来创建一个复选框。我使用了文档的方向,我有类似的东西:

table.addGeneratedColumn(CHECKBOX_COLUMN, new Table.ColumnGenerator() {
      @Override
      public Object generateCell(final Table source, final Object itemId, Object columnId) {

        final CheckBox checkBox = new CheckBox("", isItemIdSelected(source, itemId));
        checkBox.addValueChangeListener(new Property.ValueChangeListener() {
          @Override
          public void valueChange(Property.ValueChangeEvent valueChangeEvent) {

          }
});

用户选择他想要的行后,可以按一下保存按钮。

此时,我试图循环遍历整个表(使用table.getItemsIds()),检查每个项目的checkbox属性,如果选中/选中,我添加项目(行/实体)从JPAContainer)到稍后将处理的集合。但是我在这个循环中遇到严重的性能问题(JPA在实体中调用惰性属性,生成许多查询并使一切变得非常慢)。那么我如何设置一个监听器或类似的东西,允许每个用户点击(或取消忽略)一个复选框的整个项目(而不仅仅是复选框属性)?我在用Vaadin。 Hibernate 4 / JPA和Spring。

感谢您的帮助。

2 个答案:

答案 0 :(得分:3)

    table.addGeneratedColumn(CHECKBOX_COLUMN, new Table.ColumnGenerator() {
        @Override
        public Object generateCell(final Table source, final Object itemId, Object columnId) {

            final CheckBox checkBox = new CheckBox();
            checkBox.addValueChangeListener(new ValueChangeListener() {

                @Override
                public void valueChange(ValueChangeEvent event) {

                    /*
                     * do something with the itemId
                     */

                    //cast to Person entity if your table itemId is an entity object
                    Person person = (Person) itemId;
                    person.setActive(checkBox.getValue());
                }
            });

            return checkbox;
        }
    });

答案 1 :(得分:-1)

  

我如何设置一个允许的监听器或类似的东西   每个都可以访问整个项目(不仅仅是复选框属性)   用户点击(或取消选中)复选框

你对“整个项目”是什么意思?表itemId?实体对象?

您可以在vaadin表中将实体对象用作itemId。