Hibernate Vaadin用户界面不刷新

Hibernate Vaadin用户界面不刷新,hibernate,user-interface,push,vaadin,jpacontainer,Hibernate,User Interface,Push,Vaadin,Jpacontainer,我有一个代表员工的模型。它有一个字段(比如薪水),也是一个模型。所以基本上它是一个嵌套属性。我使用Hibernate、JPA容器和MasterDetailEditor来可视化数据。因此,我扩展了FieldFactory,以便能够向salary的select字段添加一个值更改侦听器。此更改将设置薪资的税务字段 它正在工作,数据在DB中更新,但在UI上更新,而不是。我试过使用Push启动,使用pollInterval,它们似乎都不起作用。我通过它的属性设置值 代码: 这在重写的createField

我有一个代表员工的模型。它有一个字段(比如薪水),也是一个模型。所以基本上它是一个嵌套属性。我使用Hibernate、JPA容器和MasterDetailEditor来可视化数据。因此,我扩展了FieldFactory,以便能够向salary的select字段添加一个值更改侦听器。此更改将设置薪资的税务字段

它正在工作,数据在DB中更新,但在UI上更新,而不是。我试过使用Push启动,使用pollInterval,它们似乎都不起作用。我通过它的属性设置值

代码:

这在重写的createField中

    final AbstractField field = (AbstractField) super.createField(container, itemId, propertyId, uiContext);
        field.setImmediate(true);

        field.addValueChangeListener(new Property.ValueChangeListener() {
            @Override
            public void valueChange(ValueChangeEvent event) {

                final Item item = container.getItem(itemId);
                final String salaryTypeSelectorValue =
                        item.getItemProperty(propertyName).getValue().toString() != null ? item.getItemProperty(propertyName).getValue()
                                .toString() : REGULAR;

                                if (REGULAR.equals(salaryTypeSelectorValue)) {

                                    final SalaryHistory salaryHistory = ((JPAContainer<SalaryHistory>) container).getItem(itemId).getEntity();

                                    JPAContainer<SalaryHistory> salaryHistoryContainer = (JPAContainer<SalaryHistory>) container;

                                    salaryHistoryContainer.getItem(itemId).getItemProperty("socialTax").setValue(new BigDecimal("28.5"));                                     
                                }
            }
        });         

        return field; 
final AbstractField=(AbstractField)super.createField(container、itemId、propertyId、uiContext);
字段。setImmediate(true);
field.addValueChangeListener(新属性.ValueChangeListener(){
@凌驾
public void valueChange(valuechangevent事件){
最终项目=container.getItem(项目ID);
最终字符串salaryTypeSelectorValue=
item.getItemProperty(propertyName).getValue().toString()!=null?item.getItemProperty(propertyName).getValue()
.toString():常规;
if(正则.equals(salaryTypeSelectorValue)){
最终SalaryHistory SalaryHistory=((JPA容器)容器).getItem(itemId).getEntity();
JPA容器salaryHistoryContainer=(JPA容器)容器;
salaryHistoryContainer.getItem(itemId).getItemProperty(“socialTax”).setValue(新的BigDecimal(“28.5”);
}
}
});         
返回字段;
更新


我成功地实现了我想要的,可能有点不成熟,因为我必须在工资模型中加入一个小逻辑:在工资类型设置器中,我也设置了税,并且UI立即更新。

谢谢你通知我简:)我成功地实现了我想要的,可能有点不成熟,因为我必须在薪资模型中加入一个微小的逻辑:在薪资类型的setter中,我也设置了税,UI立即更新。

我的猜测是,jpacontainer拥有一个缓存,更改其中某个值将传播到表中。你试过把桌子弄脏吗?我试试。谢谢我忘了提到使用了JPAContainerFactory.makenoched,立即模式为true,缓冲被禁用。如果您自己解决了问题,请在帖子中添加答案(稍后接受)。其他用户更容易确定可能的解决方案,并看到问题得到解决。谢谢